命令 hset key field value
设值:hset user:1 name monkey //成功返回1,失败返回0
取值:hget user:1 name //返回monkey
删值:hdel user:1 age //返回删除的个数
计算个数:hset user:1 name monkey; hset user:1 age 18;
hlen user:1 //返回2,user:1有两个属性值
批量设值:hmset user:2 name monkey age 18sex boy //返回OK
批量取值:hmget user:2 name age sex //返回三行:monkey 18 boy
判断field是否存在:hexists user:2 name //若存在返回1,不存在返回0
获取所有field: hkeys user:2 // 返回name age sex三个field
获取user:2所有value:hvals user:2 // 返回monkey18 boy
获取user:2所有field与value:hgetall user:2 //name age sex monkey18 18 boy值
增加1:hincrby user:2 age 1 //age 1
浮点增加:hincrbyfloat user:2 age 2 //浮点型加2
3、List集合
用来存储多个有序的字符串,一个列表最多可存2的32次方减1个元素。
添加命令:
rpush monkey c b a //从右向左插入cba, 返回值3
lrange monkey 0 -1 //从左到右获取列表所有元素 返回 c b a
lpush key c b a //从左向右插入cba
linsert monkey before b z //在b之前插入z, after为之后,使 用lrange monkey 0 -1 查看:c z b a
查找命令:
lrange key start end //索引下标特点:从左到右为0到N-1
lindex monkey -1 //返回最右末尾a,-2返回b
llen monkey //返回当前列表长度
lpop monkey //把最左边的第一个元素c删除
rpop monkey //把最右边的元素a删除
4、Set集合
常用于用户标签,社交,查询有共同兴趣爱好的人,智能推荐。保存多元素,与列表不一样的是不允许有重复元素,且集合是无序,一个集合最多可存2的32次方减1个元素,除了支持增删改查,还支持集合交集、并集、差集;
exists user //检查user键值是否存在
sadd user a b c //向user插入3个元素,返回3
sadd user a b //若再加入相同的元素,则重复无效,返回0
smembers user //获取user的所有元素,返回结果无序
srem user a //返回1,删除a元素
scard user //返回2,计算元素个数
5、有序集合ZSET
常用于排行榜,如视频网站需要对用户上传视频做排行榜,或点赞数与集合有联系,不能有重复的成员
指令:
zadd key score member [score member......]
例子:
zadd user:zan 200 monkey //monkey的点赞数1, 返回操作成功的条数1
zadd user:zan 200 monkey 120 fox 100 lion // 返回3
zadd user:zan nx 100 monkey //键test:1必须不存在,主用于添加
zadd user:zan xx incr 200 monkey //键test:1必须存在,主用于修改,此时为300
zadd user:zan xx ch incr -299 monkey //返回操作结果1,300-299=1
zrange user:zan 0 -1 withscores //查看点赞(分数)与成员名
zcard user:zan //计算成员个数, 返回1
排名场景:
zadd user:3 200 monkey120 fox 100 lee //先插入数据
zrange user:3 0 -1 withscores //查看分数与成员
zrank user:3 monkey //返回名次:第3名返回2,从0开始到2,共3名
zrevrank user:3 monkey //返回0, 反排序,点赞数越高,排名越前
6、Redis全局命令
查看所有键:
keys *
键总数 :
dbsize //2个键,如果存在大量键,线上禁止使用此指令
检查键是否存在:
exists key //存在返回1,不存在返回0
删除键:
del key //del key, 返回删除键个数,删除不存在键返回0
键过期:
expire key seconds //set name test expire name 10,表示10秒过期
ttl key // 查看剩余的过期时间
键的数据结构类型:
type key //type hello //返回string,键不存在返回none
7、redis数据库管理
select 0 //数据库 16个数据库(0-15) 默认都是0库
flushdb //清除当前数据库
flushall //清楚所有数据库记录
dbsize //命令用于返回当前数据库的 key 的数量
六、Redis持久化
持久化作用:redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化,持久化可以避免因进程退出而造成数据丢失。Redis持久化有两种方式:RDB快照和AOF方式。
1、RDBRDB持久化把当前进程数据生成快照(.rdb)文件保存到硬盘的过程,有手动触发和自动触发手动触发有save和Bgsave两命令:
- save命令:阻塞当前Redis,直到RDB持久化过程完成为止,若内存实例比较大会造成长时间阻塞,线上环境不建议用它
- bgsave命令:redis进程执行fork操作创建子线程,由子线程完成持久化,阻塞时间很短(微秒级),是save的优化,在执行redis-cli shutdown关闭redis服务时,如果没有开启AOF持久化,自动执行bgsave;
由于 save 命令是同步命令,会占用Redis的主进程。若Redis数据非常多时,save命令执行速度会非常慢,阻塞所有客户端的请求。
因此很少在生产环境直接使用SAVE 命令,可以使用BGSAVE 命令代替。如果在BGSAVE命令的保存数据的子进程发生错误的时,用 SAVE命令保存最新的数据是最后的手段。如图所示:
1.2、Bgsave命令bgsave 命令执行一个异步操作,以RDB文件的方式保存所有数据的快照。如:
127.0.0.1:6379> bgsave Background saving started
如图所示:
1.3、save 与 bgsave 对比操作:
命令:config set dir /usr/local //设置rdb文件保存路径
备份:bgsave //将dump.rdb保存到usr/local下
恢复:将dump.rdb放到redis安装目录与redis.conf同级目录,重启redis即可
1.4、RDB优缺点
RDB优点:
- 压缩后的二进制文,适用于备份、全量复制,用于灾难恢复加载RDB恢复数据远快于AOF方式
- 与AOF相比,在恢复大的数据集的时候,RDB方式会更快一些。
- 使用bgsave保存,交由子进程进行快照保存,父进程不需要再做其他IO操作,所以RDB持久化方式可以最大化redis的性能。
RDB缺点:
- 无法做到实时持久化,每次都要创建子进程,频繁操作成本过高
- 保存后的二进制文件,存在老版本不兼容新版本rdb文件的问题
快照功能(RDB)并不是非常耐久(durable): 如果 Redis 因为某些原因而造成故障停机, 那么服务器将丢失最近写入、且仍未保存到快照中的那些数据。 从 1.1 版本开始, Redis 增加了一种完全耐久的持久化方式: AOF 持久化。
打开AOF后, 每当 Redis 执行一个改变数据集的命令时(比如 SET), 这个命令就会被追加到 AOF 文件的末尾。这样的话, 当 Redis 重新启时, 程序就可以通过重新执行 AOF 文件中的命令来达到重建数据集的目的。