什么是redis
redis本质上是一个高性能的键值数据库,是nosql数据库的一种.通常被认为是一个数据结构服务器,主要是因为其有着丰富的数据结构
redis支持的数据类型
字符串String、列表List,、集合Set、散列表Hash、有序集合Zset。
redis可以做什么
计数器,缓存,消息队列(发布/订阅功能),分布式锁实现
Redis的优点
- 速度快:使用标准C写,所有数据都在内存中完成,读写速度分别达到10万/20万 。
- 丰富的数据类型 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 自动操作,对不同数据类型的操作都是自动的
- 快速的主从复制,保证了数据,和服务的安全性
Redis的缺点
数据库容量受到物理内存的限制
Redis的存储机制和持久化方案
RDB持久化策略 :使用快照的方式,是redis默认的方式,
原理:先将数据存储到内存,当数据到达设定的值后,触发一次转存操作
AOF持久化策略:需要手动开启.
原理:没执行一条会更改数据的命令,都会直接持久化到硬盘中指定的aof文件, 其存储的不是数据,而是执行的命令
Redis是单线程的吗
是的,redis为了效率最大化,使用内存存储方法,这样做可以避免多线程会出现的上下文切换,对于一个内存的系统来说,是没有上下文切换的问题的.
redis的使用
下载安装包,引入到Linux系统,一般会放到/usr/local/src/目录下
解压
tar -xvf redis-5.0.4.tar.gz
安装 在redis的跟目录下执行/usr/local/src/redis/src
make : 加载环境
返回上图后使用命令
make install 安装
修改redis的配置文件
命令: vim redis.conf
进入到配置文件并可以进行修改
关闭保护模式
开始后台运行
**启动reids服务 **启动默认的redis 端口是6379
启动命令: redis-server redis.conf
进入客户端命令: redis-cli -p 6379
exit 退出命令界面
进入客户端测试是否启动成功
关闭Redis命令:
redis-cli -p 6379 shutdown
reids 常用命令
登录 redis-cli -p 5566 -a password
检查key是否存在 EXISTS key
搜索某关键字 KSYS *4
返回一个Key所影响的vsl的类型 TYPE key
1.1 Redis命令
1.1.1 String类型
命令 | 说明 | 案例 |
set | 添加key-value | set username admin |
get | 根据key获取数据 | get username |
strlen | 根据key获取值的长度 | strlen key |
exists | 判断key是否存在 | exists name 返回1存在 0不存在 |
del | 删除redis中的key | del key |
Keys | 用于查询符合条件的key | keys * 查询redis中全部的key keys n? 使用占位符获取数据 keys nam* 获取nam开头的数据 |
mset | 赋值多个key-value | mset key1 value1 key2 value2 key3 value3 |
mget | 获取多个key的值 | mget key1 key2 |
append | 对某个key的值进行追加 | append key value |
type | 检查某个key的类型 | type key |
select | 切换redis数据库 | select 0-15 redis中共有16个数据库 |
flushdb | 清空单个数据库 | flushdb |
flushall | 清空全部数据库 | flushall |
incr | 自动加1 | incr key |
decr | 自动减1 | decr key |
incrby | 指定数值添加 | incrby 10 |
decrby | 指定数值减 | decrby 10 |
expire | 指定key的生效时间 单位秒 | expire key 20 key20秒后失效 |
pexpire | 指定key的失效时间 单位毫秒 | pexpire key 2000 key 2000毫秒后失效 |
ttl | 检查key的剩余存活时间 | ttl key -2数据不存在 -1该数据永不超时 |
persist | 撤销key的失效时间 | persist key |
1.1.2 Hash类型
说明:可以用散列类型保存对象和属性值
例子:User对象{id:2,name:小明,age:19}
命令 | 说明 | 案例 |
hset | 为对象添加数据 | hset key field value |
hget | 获取对象的属性值 | hget key field |
hexists | 判断对象的属性是否存在 | HEXISTS key field 1表示存在 0表示不存在 |
hdel | 删除hash中的属性 | hdel user field [field …] |
hgetall | 获取hash全部元素和值 | HGETALL key |
hkyes | 获取hash中的所有字段 | HKEYS key |
hlen | 获取hash中所有属性的数量 | hlen key |
hmget | 获取hash里面指定字段的值 | hmget key field [field …] |
hmset | 为hash的多个字段设定值 | hmset key field value ,[field value …] |
hsetnx | 设置hash的一个字段,只有当这个字段不存在时有效 | HSETNX key field value |
hstrlen | 获取hash中指定key的值的长度 | HSTRLEN key field |
hvals | 获取hash的所有值 | HVALS user |
1.1.3 List类型
说明:Redis中的List集合是双端循环列表,分别可以从左右两个方向插入数据.
List集合可以当做队列使用,也可以当做栈使用
队列:存入数据的方向和获取数据的方向相反
栈:存入数据的方向和获取数据的方向相同
命令 | 说明 | 案例 |
lpush | 从队列的左边入队一个或多个元素 | LPUSH key value [value …] |
rpush | 从队列的右边入队一个或多个元素 | RPUSH key value [value …] |
lpop | 从队列的左端出队一个元素 | LPOP key |
rpop | 从队列的右端出队一个元素 | RPOP key |
lpushx | 当队列存在时从队列的左侧入队一个元素 | LPUSHX key value |
rpushx | 当队列存在时从队列的右侧入队一个元素 | RPUSHx key value |
lrange | 从列表中获取指定返回的元素 | LRANGE key start stop Lrange key 0 -1 获取全部队列的数据 |
lrem | 从存于 key 的列表里移除前 count 次出现的值为 value 的元素。 这个 count 参数通过下面几种方式影响这个操作: · count > 0: 从头往尾移除值为 value 的元素。 · count < 0: 从尾往头移除值为 value 的元素。 · count = 0: 移除所有值为 value 的元素。 | LREM list -2 “hello” 会从存于 list 的列表里移除最后两个出现的 “hello”。 需要注意的是,如果list里没有存在key就会被当作空list处理,所以当 key 不存在的时候,这个命令会返回 0。 |
Lset | 设置 index 位置的list元素的值为 value | LSET key index value |
1.1.4 Redis事务命令
说明:redis中操作可以添加事务的支持.一项任务可以由多个redis命令完成,如果有一个命令失败导致入库失败时.需要实现事务回滚.
命令 | 说明 | 案例 |
multi | 标记一个事务开始 | 127.0.0.1:6379> MULTI |
exec | 执行所有multi之后发的命令 提交 | 127.0.0.1:6379> EXEC |
discard | 丢弃所有multi之后发的命令回滚 |