redis数据结构介绍
redis是一个key-value的数据库,key一般是String类型,但是value的类型有很多:
基本类型:String,Hash,List,Set,SortedSet(可排序的不能重复的集合)
特殊类型:GEO,BitMap,HyperLog等
文档官网:Commands | Docs
redis通用命令
对任何数据都适用的
通过命令行或者官网的keys类进行查找
1、KEYS
查看符合模板的所有key,通配符,类似模糊查询
例:keys name keys *
但是,如果数据量过大时,keys由于是模糊查询,所有查询效率慢,redis又是单线程的,就会导致阻塞。
如果是集群开发,可以在副线程用keys查询。
2、del
删除,可以删除一组数据
下面是添加了k1,k2,k3三组数据,然后进行删除,其中age,k1,k2都有,k4没有,所以结果显示删除了3个
3、exists
判断是否存在,同样可以判断多个,同上
4、expire
给key设置一个有效期,有效期到了key会自动被删除,单位是秒
比如短信验证码等数据,一直存在会占用内存
5、ttl
查看一个key的剩余有效期
设置有效期30秒
name没了就会显示-2
-1则说明是永久存在的
String
String的value是字符串,根据字符串的格式不同可以分为3类
string:普通字符串
int:整数类型,可以做自增自减操作
float:浮点类型,可以做自增自减操作
操作:
String的常见命令有:
SET:添加或者修改已经存在的一个String类型的键值对
GET:根据key获取String类型的value
MSET:批量添加多个String类型的键值对
MGET:根据多个key获取多个String类型的value
INCR:让一个整型的key自增1
INCRBY:让一个整型的key自增并指定步长,例如: incrby num 2 让num值自增2
INCRBYFLOAT:让一个浮点类型的数字自增并指定步长
SETNX:添加一个String类型的键值对,前提是这个key不存在,否则不执行
SETEX:添加一个String类型的键值对,并且指定有效期
例:
set/get
mset/mget
返回一个数组,redis中的数组就是按这种样式存储的
incr/incrby/incrbyfloat
自增
setnx
有name所以不让存,不存在时才让存
setnx
key的层级格式
由于redis中键不允许重复,所以key的结构需要注意,不能说这里用1,下一个用2,而且redis的表是有限的,所以我们给key的命名提出一定的约束:
例如,可以像: 项目名:业务名:类型:id
这样的模式来分类id xianyang:xianyangshifan:jisuanjiyuan:jike:2101:15
如果value是java对象的话,可以将对象的内容序列化为json字符串后存储
插入几个参数后,在命令行看不太明显
在图形化工具上是这样
很清楚的对wan:user进行了分类
Hash类型
Hash类型,也叫散列,它的value是一个无序的字典,类似于HashMap
String的value是将对象进行序列化为JSON字符串,修改的话基本就是重新覆盖,不容易搞。
但是Hash结构可以将对象中的字段独立存储,可以针对单个字段做CRUD;
常见命令
Hash的常见命令有:(String的前面多加个H)
HSET key field value:添加或者修改hash类型key的field的值
HGET key field:获取一个hash类型key的field的值
HMSET:批量添加多个hash类型key的field的值
HMGET:批量获取多个hash类型key的field的值
HGETALL:获取一个hash类型的key中的所有的field和value
HKEYS:获取一个hash类型的key中的所有的field
HVALS:获取一个hash类型的key中的所有的value
HINCRBY:让一个hash类型key的字段值自增并指定步长
HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行
例子:
hset
结构:
修改:直接重新输入数据
List类型:
主要用来保存对顺序有一定需要的数据:朋友圈的点赞,朋友圈的评论谁先谁后...
redis中的List类型与java中的LinkedList类似,可以看做双向链表,支持正向和反向检索。
特征:
有序
元素可重复
插入和删除快
查询速度一般
List常见命令:
对首:
LPUSH key element ...:向列表左侧插入一个或多个元素
LPOP key:移除并返回列表左侧的第一个元素,没有则返回nil
对尾:
RPUSH key element ...︰向列表右侧插入一个或多个元素
RPOP key:移除并返回列表右侧的第一个元素
LRANGE key star end:返回一段角标范围内的所有元素 LRANGE key 1 2
BLPOP和BRPOP:与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil
例子:
lpush
这里是因为,他从左边开始放,先放1,然后2,然后3,3在2的左边,2在1的左边,同理,所以第一个插的在最右边。
lpop
这就把第一个5取走了
lrange
这里的值不变
思考:
如何利用List结构模拟一个栈?
·入口和出口在同一边
如何利用List结构模拟一个队列?
入口和出口在不同边
如何利用List结构模拟一个阻塞队列?
入口和出口在不同边
出队时采用BLPOP或BRPOP,即会等待
Set类型
Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征:
无序(数据的顺序和我们插入的顺序无关,是有hash算法算出来的)
元素不可重复(相同元素会覆盖)
查找快
支持交集、并集、差集等功能(用于社交,好友列表等功能)
常见命令
对单个集合的增删查
SADD key member ...:向set中添加一个或多个元素
SREM key member ...:移除set中的指定元素
SCARD key:返回set中元素的个数(计数)
sismember key member:判断一个元素是否存在于set中
SMEMBERS :获取set中的所有元素
多个集合之间操作(交集,差集,并集)
SINTER key1 key2 ...︰求key1与key2的交集
SDIFF key1 key2 ...:求key1与key2的差集(这里指key1中有的key2中没有的)
SUNION key1 key2 ..:求key1和key2的并集
SortedSet类型
Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加 hash表,跳表是用来排序的,hash是存储数据的。SortedSet具备下列特性:
`可排序
`元素不重复查询
`速度快
因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能。
常用命令
ZADD key score member:添加一个或多个元素到sorted set,如果已经存在则更新其score值
ZREM key member:删除sorted set中的一个指定元素
ZSCORE key member:获取sorted set中的指定元素的score值
ZRANK key member:获取sorted set中的指定元素的排名,从0开始的
ZCARD key:获取sorted set中的元素个数
ZCOUNT key min max:统计score值在给定范围内的所有元素的个数
ZINCRBY key increment member: 让sorted set中的指定元素自增,步长为指定的increment值
ZRANGE key min max:按照score排序后,获取指定排名范围内的元素
ZRANGEBYSCORE key min max:按照score排序后,获取指定score范围内的元素ZDIFF、ZINTER、ZUNION:求差集、交集、并集
注意:
这里的排序默认是升序,降序需要在Z后面加REV
ZRANGE,改为:ZREVRANGE。