0.Redis和Memcached的区别
memcache:仅支持String类型。没有原生的集群模式。使用多核,在处理100K以上数据时更有优势。
Redis:支持多种数据结构,有更丰富的数据操作。用户群体庞大,稳定性高。支持Cluster模式。
1.Redis的数据类型
string
最常规的kv存储,value最大存储512M。
缓存配置信息,缓存常用查询的字段;共享用户session,利用redis将用户的session进行集中管理。
// 增加
add key value
// 查询
get key
// 删除
del key
hash
用于键值对集合,适合存储(无嵌套)对象。
// 增加
HMSET key field1 value1 field2 value2
HSET key field1 value1
// 查询
hget key field
// 删除
hdel key
list
用于存储List列表,可以实现一个简单的消息队列。可以实现文章列表或者数据分页,比如博客网站中博文的分页显示。
// 增加
lpush key value1
// 查询 0表示开始位置 -1表示结束位置
lrange key 0 -1
// 取出元素
rpop key 10
set
String类型的一个无序集合。通过hash表来实现,查找和删除复杂度的O(1)
可以进行一些集合操作,并集、差集、交集等。比如用来查看共同好友。
// 增加
sadd key value
// 查看所有元素
smembers key
// 查看是否包含某个元素
smembers key value
// 删除某个元素
srem key 1
//查看元素个数
scard key
// 随机删除一个元素
spop key
// 对set进行集合操作
//将第一个集合元素移动到第二个集合
smove set1 set2 value1
//求两个set的交集
sinter set1 set2
//求两个set的并集
sunion set1 set2
//求两个set的差集
sdiff set1 set2
sortedset
基于set,可以为其中每一项打分。比如访问量,排行榜,微博热搜等
zadd board 85 zhangsan
zadd board 72 lisi
zadd board 96 wangwu
zadd board 63 zhaoliu
# 获取排名前三的用户(默认是升序,所以需要 rev 改为降序)
zrevrange board 0 3
# 获取某用户的排名
zrank board zhaoliu
2.如果有大量的key需要设置同一时间过期,一般需要注意什么
在过期时间后加一个随机数,避免expire同时进行,造成缓存雪崩。
3.redis分布式锁
setnx指令,为了避免使用的锁占用的过程中系统挂掉,可以给其设置一个过期时间。
4.Redis有10亿个key获取已知前缀开头的,将其全部找出?
通过keys指令可以获取。但是由于Redis是单线程的,使用该指令会造成阻塞,导致其他操作无法进行,在线上使用很危险。
可以使用scan指令来处理,会无阻塞的查出所有的数据,但是可能会有重复。只需要在代码端做一次去重即可。
smembers指令也可以返回集合中所有的元素。
但是SCAN这类增量式迭代指令,在增量迭代的过程中,可能会有key值被修改的问题。