数据结构
字符串 :可以是字符串、数字、整形浮点数、二进制(图片/音频/视频),最大不超过512M。
设值命令
set age 37 ex 10 -- 设置10秒后过期
setnx name magicq -- 不存在键时,返回1设置成功;存在时失败返回0
取值命令
get age -- 存在键返回对应值,不存在返回nil
批量设值
mset age 37 name magic -- 会覆盖旧值,如果不希望这个效果,则考虑使用msetnx,这个操作是原子操作,只有当所有key都不存在时操作成功1。否则返回0。
批量取值
mget age name gender -- 返回37,magicq gender为nil
字符串(string)计数
incr age -- INCR 命令是一个针对字符串的操作。 因为 Redis 并没有专用的整数类型, 所以键 key 储存的值在执行 INCR 命令时会被解释为十进制 64 位有符号整数。
decr age -- 对字符串进行减一操作
incrby age 2 --对字符串进行加二操作
decrby age 2 -- 对字符串进行减二操作
incrbyfloat age 1.1 --浮点型age加1.1
字符串(string)追加
append name hello,world!! -- 字符串追加,每个中文占3个字节。如果name存在则追加,不存在则相当于字符串设值操作(set name hello,world!! )
哈希(Hash)
HSET hash field value --创建hash表,并设值field对应的值。 当 HSET 命令在哈希表中新创建 field 域并成功为它设置值时, 命令返回 1 ; 如果域 field 已经存在于哈希表, 并且 HSET 命令成功使用新值覆盖了它的旧值, 那么命令返回 0 。
HMSET hash field1 value1 field2 value2 -- 创建hash表,并批量设值field及其对应的值。
HGET hash field --取得hash表field对应的值
HMGET hash filed1 ,field2 --批量获取hash表对应域的值
HDEL hash field1,field2 --删除hash表一个或多个field,field存在则删除成功,返回1;field不存在则删除失败,返回0。
HKEYS key --返回hash表key中所有域。当key存在,则返回域列表,不存在则返回空列表。
HLEN key -- 返回哈希表 key 中域的数量,与之相似的HKEYS key 是返回域的明细列表。
HSTRLEN key field -- 返回哈希表 key 中, 与给定域 field 相关联的值的字符串长度(string length)。如果给定的键或者域不存在, 那么命令返回 0 。
HEXISTS key field -- 判断field是否存在,存在返回1,不存在返回0。
HVALS key --返回hash表key中所有的field值。
HGETALL key --返回hash表key中所有域和值。
HINCRBY key field 1 -- 为哈希表 key 中的域 field 的值加上增量 increment,增量也可以为负数,相当于对给定域进行减法操作。(操作后的field值被限定为64位有符号整数内,如果field为字符串值,该操作会报错)
列表(list)
LLEN key --返回列表长度
LINDEX key index -- 返回列表 key 中,下标为 index 的元素。以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
LSET key index value -- 将列表 key 下标为 index 的元素的值设置为 value 。
LPUSH key value [value …] -- 将一个或多个值 value 插入到列表 key 的表头。
LPOP key -- 移除并返回列表 key 的头元素,key不存在时返回nil。
LRANGE key start end -- 返回包含指定区间内的元素列表。
集合(set)
SADD key member [member …] -- 将一个或多个元素加入集合key中,如果key中存在该member将忽略,key为非集合时报错,key不存在时创建新的集合。
SPOP key -- 移除并返回集合中的一个随机元素。
SMEMBERS key -- 返回集合 key 中的所有成员。
SCARD key -- 返回集合基数(成员数量)
SINTER key [key …] -- 返回集合的交集。
SUNION key [key …] -- 返回集合的并集。
SDIFF key [key …] -- 返回集合的差集。
有序集合(zset)
ZADD key score member -- 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。 zadd key xx|nx score member ,其中nx表示key必须不存在,创建有序集合。xx表示key必须存在,用于对成员进行更新操作。
ZINCRBY key increment member -- 为有序集 key 的成员 member 的 score 值加上增量 increment 。此命令等同于 zadd key xx incr score member。
ZRANGE key start stop [WITHSCORES] -- 返回有序集 key 中,指定区间内的成员。
ZCARD key -- 返回有序集 key 的基数。
脚本命令
全局命令
Q&A
Redis为什么速度这么快(缓存因素除外)?
采用c语言实现
基于内存操作
pipline及Lua脚本执行命令,减少RTT
Redis版本选择
redis的第二位版本号是偶数代表当前版本是稳定版,为奇数则表明当前是下一个稳定版本的开发版。
谈谈Redis有哪些应用场景?
数据库缓存
排行榜
计数器
社交网络
消息队列
其他
缓存雪崩如何解决?
雪崩现象:是指在某一个时间段,缓存集中过期失效。
解决方案:对热门缓存失效期设值长些,冷门缓存失效期短些。这种周期性失效产生的雪崩,无非使数据库面临着周期性的访问IO上升,此时数据库一般是能顶的住的。就怕是缓存节点宕机,造成大量缓存失效带来的非自然雪崩,很可能压垮数据库。
缓存穿透如何解决?
缓存穿透:http请求伪造无效关键字进行DB查询,使得redis失效,查询大量落到DB。
解决方案:将入库数据同时存入布隆过滤器(0不存在,1存在),当查询DB前,先使用布隆过滤器对落到DB的请求进行拦截判断,如果布隆过滤器返回0,则表示当前请求为无效请求,DB中不存在,否则查询DB。
如何使用Redis完成订单列表场景?
1、将订单信息使用hash表进行封装。
2、将hash表作为元素放入list中。
谈谈Redis两种持久化(RDB和AOF)及加载流程?
RDB持久化方式: 手动触发可使用SAVE和BGSAVE命令。
SAVE命令:执行一个同步保存操作,将当前Redis实例的所有数据快照(snapshot)以 RDB 文件的形式保存到硬盘。由于当前任务会阻塞所有客户端线程,因此线上不建议使用。
BGSAVE命令:在后台异步(Asynchronously)保存当前数据库的数据到磁盘。BGSAVE 命令执行之后立即返回 OK ,然后 Redis fork 出一个新子进程,原来的 Redis 进程(父进程)继续处理客户端请求,而子进程则负责将数据保存到磁盘,然后退出。客户端可以通过 LASTSAVE 命令查看相关信息,判断 BGSAVE 命令是否执行成功。在redis-cli shutdown关闭redis服务时,如果没有开启AOF持久化,自动执行BGSAVE。
RDB持久化步骤
1、 config set dir /usr/local
2、bgsave ,将dump.rdb保存到/usr/local下
3、将dump.rdb文件拷贝到redis安装目录与redis.conf同级目录,重启redis即可。
RDB持久化优缺点
优点:
压缩后的二进制文件,适用于备份、全量复制,用于灾难恢复。
加载RDB恢复数据远快于AOF方式。
缺点:
无法做到实时持久化,每次都要创建子线程,频繁操作成本过高。
二进制文件,存在老版本不兼容新版本rbd文件问题。
AOF持久化: 是一种利用操作日志进行恢复的实时持久化方案。
流程
1. 追加日志:所有写入命令(set/hset)会追加到aof_buf缓冲区。
2. 同步磁盘:AOF缓冲区向磁盘sync同步。
3. 重写压缩:随着AOF文件越来越大,定期对AOF文件rewrite重写,达到压缩。
4. 加载恢复:当redis重启,可load加载AOF文件进行加载并解析恢复。
实现
将redis.conf设置:appendonly yes后,默认生成 appendfilename "appendonly.aof" 文件。
持久化加载流程
当AOF和RDB同时存在时,优先加载AOF
若关闭了AOF,加载RDB文件
加载AOF/RDB成功,redis重启成功
AOF/RDB失败,redis重启打印错误信息
参考文献
http://redisdoc.com/