1、Redis支持的键值数据类型
-
字符串类型 string
-
哈希类型 hash
-
列表类型 list
-
集合类型 set
-
有序集合类型 sortedset
2、Redis的应用场景
-
缓存(数据查询、短连接、新闻内容、商品内容等等)
-
聊天室的在线好友列表
-
任务队列。(秒杀、抢购、12306等等)
-
应用排行榜
-
网站访问统计
-
数据过期处理(可以精确到毫秒)
-
分布式集群架构中的session分离
3、Redis数据库清楚
-
flushdb 清楚本数据库全部数据'
-
flushAll 清楚全部数据库数据
Redis五大数据类型常用操作
-
redis存储的是:key,value格式的数据,其中key都是字符串,value有5种不同的数据结构
-
value的数据结构:
-
1) 字符串类型 string
-
2) 哈希类型 hash : map格式
-
3) 列表类型 list : linkedlist格式。支持重复元素
-
4) 集合类型 set : 不允许重复元素
-
5) 有序集合类型 sortedset:不允许重复元素,且元素有顺序
String常用命令
-
计数器
string类型的incr和decr命令的作用是将key中储存的数字值加一/减一,这两个操作具有原子性,总能安全地进行加减操作,因此可以用string类型进行计数,如微博的评论数、点赞数、分享数,抖音作品的收藏数,京东商品的销售量、评价数等。
2、命令
select 3 #切换至3号数据库
dbsize #查看当前数据库的 数据量 一般为 k-v 的对数
keys * #查看当前库中的所有 key
flushdb #清空当前数据库
flushall #清空所有数据库
set name zz #存入一个 name-zz的 k-v数据
get name #将返回这个key对应的值 zz
exits name #判断当前key是否存在 存在返回1否则返回0
move name 1 #移动 这个k-v 到指定数据库
expire name 10 #设置这个k-v的过期时间为10秒
ttl name #查看这个k-v剩余的有效期时间
type name #查看当前key的类型
append name "hh" #将name对应的value值拼接 再次get name时会返回 zzhh 如果key不存在则等价于set
strlen name #查看这个key对应的value值的长度
set views 0
incr views #自增1 下次get views将返回1
decr views #自减1 下次get views将又返回0
incrby views 5 #自增5 下次get views将返回5
decrby views 5 #自减5 下次get views将返回0
getrange name 1 2 #返回name对应value的一部分 从下标1开始到下标2结束 即zh
getrange name 0 -1 #返回name对应value的一部分 从下标0开始到末尾 即zzhh
setrange name 1 ab #将name下标1开始的位置 替换为ab 返回 zabh
setex name1 10 "aaa" #如果name1不存在则创建k-v并指定过期时间10秒,具有原子性。 如果存在则覆盖value指定过期时间10秒
setnx name2 bbb #如果不存在这个key则创建成功返回1,如果存在 则创建失败返回0
mset k1 v1 k2 v2 k3 v3 #批量设置这3个k-v对
mget k1 k2 k3 #批量返回相应k值的相应value值
msetnx k1 v1 k4 v4 #批量不存在时设置,具有原子性,如此时k1存在k4不存在,但会全部失败返回0
set user:1 {name:zhangsan,age:10} #保存对象
mset user:1:name zhangsan user:1:ange 10 #也可有上述效果
getset name ccc #先get再set 不存在时 返回nil,但set仍然会生效!等价与创建了一个新的k-v。存在时返回之前的value值且覆盖掉这个value,下次get会返回刚设置的新值
List命令
list类型是简单的字符串列表,按照插入顺序排序。每个列表最多可以存储 232 - 1 个元素(40多亿) ,list类型主要有以下应用场景。。
-
消息队列
list类型的lpop和rpush(或者反过来,lpush和rpop)能实现队列的功能,故而可以用Redis的list类型实现简单的点对点的消息队列。不过我不推荐在实战中这么使用,因为现在已经有Kafka、NSQ、RabbitMQ等成熟的消息队列了,它们的功能已经很完善了,除非是为了更深入地理解消息队列,不然我觉得没必要去重复造轮子。
-
排行榜
list类型的lrange命令可以分页查看队列中的数据。可将每隔一段时间计算一次的排行榜存储在list类型中,如京东每日的手机销量排行、学校每次月考学生的成绩排名、斗鱼年终盛典主播排名等,下图是酷狗音乐“K歌擂台赛”的昨日打擂金曲排行榜,每日计算一次,存储在list类型中,接口访问时,通过page和size分页获取打擂金曲。但是,并不是所有的排行榜都能用list类型实现,只有定时计算的排行榜才适合使用list类型存储,与定时计算的排行榜相对应的是实时计算的排行榜,list类型不能支持实时计算的排行榜,之后在介绍有序集合sorted set的应用场景时会详细介绍实时计算的排行榜的实现。
-
最新列表
list类型的lpush命令和lrange命令能实现最新列表的功能,每次通过lpush命令往列表里插入新的元素,然后通过lrange命令读取最新的元素列表,如朋友圈的点赞列表、评论列表。
但是,并不是所有的最新列表都能用list类型实现,因为对于频繁更新的列表,list类型的分页可能导致列表元素重复或漏掉,举个例子,当前列表里由表头到表尾依次有(E,D,C,B,A)五个元素,每页获取3个元素,用户第一次获取到(E,D,C)三个元素,然后表头新增了一个元素F,列表变成了(F,E,D,C,B,A),此时用户取第二页拿到(C,B,A),元素C重复了。只有不需要分页(比如每次都只取列表的前5个元素)或者更新频率低(比如每天凌晨更新一次)的列表才适合用list类型实现。对于需要分页并且会频繁更新的列表,需用使用有序集合sorted set类型实现。另外,需要通过时间范围查找的最新列表,list类型也实现不了,也需要通过有序集合sorted set类型实现,如以成交时间范围作为条件来查询的订单列表。之后在介绍有序集合sorted set类型的应用场景时会详细介绍sorted set类型如何实现最新列表。
命令
#list的操作
lpush list one #往list顶端插入值
lrange list 0 -1 #返回list中所有值
rpush list four #往list底部插入值
lpop list #移除list顶端元素,并返回该元素
rpop list #移除list底部元素,并返回该元素
lindex list 0 #获取list中指定下标为0的值,同上理解就是顶端
llen list #返回list的长度
lrem list 1 value #移除list中指定个数的value值
ltrim list 1 2 #截断list,保留指定下标中的值
rpoplpush list1 haha2 #从list1底部移除一个元素并返回,且将该元素插入list2的顶端
exists list #判断list是否存在 存在返回1否则返回0
lset list 0 haha #修改列表指定位置的值, 需要列表和该位置元素已存在,否则报错
linsert list before hello new #往指定列表的指定元素的前面插入指定值
linsert list after hello new1 #往指定列表的指定元素的后面插入指定值
Set集合