目录
1.redis的数据结构:
2.命令操作:
1.通用命令:
2.String类型:
3.Hash类型:
4.List类型:
5.集合类型 set:
6.有序集合类型 sortedset:
7.位操作Bitmaps:
8.基数统计HyperLog:
9.经纬度GEO:
redis存储的是:key,value格式的数据,其中key都是字符串,value常用的有8种不同的数据结构
value的数据结构:
基本数据结构 | 说明 |
---|---|
字符串类型 String | String |
哈希类型 Hash | map格式 |
列表类型 List | linkedlist格式。支持重复元素 |
集合类型 Set | 不允许重复元素 |
有序集合类型 SortedSet | 不允许重复元素,且元素有顺序 |
特殊数据结构 | 说明 |
---|---|
Geo | 存储的地理位置的经纬度 |
BitMap | 本身不是一种数据类型, 实际上它就是字符串,可以实现对位的操作 |
HyperLog | Redis HyperLogLog 是用来做基数统计的算法 |
格式 | 说明 |
---|---|
select [数据库号] | 切换数据库(redis的数据库有16个) |
help @[数据类型] | 查看相关数据类型的命令 |
help [commend] | 查询相关命令的用法 |
keys [条件] | 查看符合模板的所有key,不建议在生产环境设备上使用 |
expire [key] [time] | 给一个key设置有效期,到期时会被自动删除;创建key时没有设置时间key将永久有效,表示为-1; |
ttl [key] | 查看一个KEY的剩余有效期 |
exists [key] | 判断key是否存在 |
set [key] [value] | 添加或者修改已经存在的一个String类型的键值对 |
set [key] [value] ex [time] | 组合命令,添加一个的键值对,并且指定有效期(单位秒) |
get [key] | 获取指定 key 的值 |
mset [key1] [value1] ... | 批量添加多个键值对 |
mget [key1] [key2] ..... | 根据多个key获取多个String类型的value |
setnx [key] [value] | 添加一个String类型的键值对,前提是这个key不存在,否则不执行 |
setex [key] [time] [value] | 添加一个String类型的键值对,并且指定有效期(单位秒) |
del [key1] [key2]..... | 删除一个指定的key,或删除多个key |
flushdb | 当前数据库中的所有Key |
flushall | 所有数据库中的key |
incr [key] | 让一个整型的key自增1,返回增加1后的值 |
incrby [key] [增长数] | 让一个整型的key自增并指定步长,返回增加1个步长后的值 |
decr [key] | 将 key 中储存的数字值减一 |
decr key [增长数] | key 所储存的值减去给定的减量值(decrement) |
append [key] [value] | 如果 key 已经存在并且是一个字符串,将指定的value 追加到该 key 原来值 value 的末尾 |
查看相关数据类型的命令
help @hash
查询相关命令的用法
help keys
查看符合模板的所有key,不建议在生产环境设备上使用
keys * # 查询所有的键 keys a* # 查询以a开头的键
删除一个指定的key,或删除多个key
del k1 k2 k3
判断key是否存在
exists name
给一个key设置有效期,有效期到期时该key会被自动删除;如果创建key时没有设置时间key将永久有效,表示为-1;
expire name 20 # (单位秒)
查看一个KEY的剩余有效期
ttl name
String类型,也就是字符串类型,时Redis中最简单的存储类型。
其中value是字符串,不过根据字符串的格式不同,又可以分为3类:
分类 | 说明 |
---|---|
string | 普通字符串 |
int | 整形类型,可以做自增,自减操作 |
float | 浮点类型,可以做自增,自减操作 |
不管是哪种格式,底层都是字节数组形式存储,只不过是编码方式不同。字符串类型的最大空间不能超过512m.
常见命令:
# 添加或者修改一个String类型的键值对 set name itcast
# 添加或者修改一个String类型的键值对(多key结构) set heima:user:1 itcast
# 批量添加多个String类型的键值对 mset k1 v1 k2 v2 k3 v3
# 根据多个key获取多个String类型的value mget k1 k2 k3
# 让一个整型的key自增1 incr age
# 让一个整型的key自增并指定步长 incrby age 2
# 添加一个String类型的键值对,前提是这个key不存在;如果不存在不执行 setnx lock 1
Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构
String结构是将对象序列化为JSON字符串后存储,当需要修改对象某个字段时很不方便
Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD:
常用命令:
常用命令 | 说明 |
---|---|
hset [key] [field] [value] | 添加或者修改hash类型key的field的值 |
hget [key] [field] | 获取一个hash类型key的field的值 |
hmset [key1] [field1] [value1] [field2] [value2]... | 批量添加多个hash类型key的field的值 |
hmget [key1] [field1] [field2]..... | 批量获取多个hash类型key的field的值 |
hgetall [key] | 获取一个hash类型的key中的所有的field和value |
hkeys [key] | 获取一个hash类型的key中的所有的field |
hvals [key] | 获取一个hash类型的key中的所有的value |
hincrby [key] [field] [time] | 让一个hash类型key的字段值自增并指定步长,返回增长后的值 |
hsetnx [key] [field] [value] | 添加一个hash类型的key的field值,前提是这个field不存在,否则不执行 |
# 添加或者修改hash类型key的field的值 hset heima:user:1 name zhangsan hset heima:user:1 age 18
# 获取一个hash类型key的field的值 hget heima:user:3 age
# 获取一个hash类型的key中的所有的field和value hgetall heima:user:3
# 获取一个hash类型的key中的所有的field hkeys heima:user:3
# 让一个hash类型key的字段值自增并指定步长,返回增长后的值 hincrby heima:user:3 age 2
Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。
特征也与LinkedList类似:
有序 2.元素可以重复 3.插入和删除快 4.查询速度一般
常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等。
常用命令:
常见命令 | 说明 |
---|---|
lpush [key] [value2] [value2].... | 向列表左侧插入一个或多个元素,返回链表长度 |
lpop [key] | 移除并返回列表左侧的第一个元素,没有则返回null |
rpush [key] [value2] [value2].... | 向列表右侧插入一个或多个元素,返回链表长度 |
rpop | 移除并返回列表右侧的第一个元素 |
lrange [key] [start] [end] | 返回一段角标范围内的所有元素,从零开始[ start end ) |
blpop [key] [time] | 移除并返回列表左侧的第一个元素,只不过在没有元素时等待指定时间(单位秒) |
brpop [key] [time] | 移除并返回列表右侧的第一个元素,只不过在没有元素时等待指定时间(单位秒) |
# 向列表左侧插入一个或多个元素(顺序为3-2-1) lpush users 1 2 3
# 向列表右侧插入一个或多个元素(顺序为1-2-3) rpush users 1 2 3
# 移除并返回列表左侧的第一个元素 lpop users
# 返回一段角标范围内的所有元素,[ start end ) lrange users 0 2
# 移除并返回列表左侧的第一个元素,只不过在没有元素时等待指定时间(单位秒) blpop users 10
Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征:
特点:
无序 2.元素不可重复 3.查找快 4.支持交集、并集、差集等功能
常见命令:
常见命令 | 说明 |
---|---|
sadd [key] [value1] [value2].... | 向set中添加一个或多个元素 |
srem [key] [value] | 移除set中的指定元素 |
scard [key] | 返回set中元素的个数 |
sismember [key] [value] | 判断一个元素是否存在于set中,如果存在返回1 |
smembers [key] | 获取set中的所有元素 |
sinter [key1] [key2] | 求key1与key2的交集,返回相同的元素 |
sdiff [key1] [key2] | 求key1与key2的差集,返回key1中不相同的元素 |
sunion [key1] [key2] | 求key1和key2的并集,返回所有的元素(不重复) |
# 向set中添加一个或多个元素 sadd users a b c d
# 移除set中的指定元素 srem users a
# 返回set中元素的个数 scard users
# 判断一个元素是否存在于set中 sismember users a
# 获取set中的所有元素 smembers users
# 求key1与key2的交集,返回相同的元素 sinter users products
Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加 hash表
SortedSet具备下列特性:
可排序 2.元素不重复 3.查询速度快
因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能。
注意:所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可
注意:score为相同数据类型
常用命令:
常用命令 | 说明 |
---|---|
zadd [key] [score1] [value1] [score2] [value2].... | 添加一个或多个元素到sorted set ,如果已经存在则更新其score值 |
zrem [key] [value] | 删除sorted set中的一个指定元素 |
zscore [key] [value] | 获取sorted set中的指定元素的score值 |
zrank [key] [value] | 获取sorted set 中的指定元素的排名,从零开始 |
zcard [key] | 获取sorted set中的元素个数 |
zcount [key] [min] [max] | 统计score值在给定范围内的所有元素的个数,包括min和max |
zrange [key] [start] [stop] | 按照score排序后,获取指定排名范围内的元素,包括start和stop |
zincrby [key] [increment] [value] | 让sorted set中的指定元素自增,步长为指定的increment值 |
zrangebyscore [key] [min] [max] | 按照score排序后,获取指定score范围内的元素,包括min和max |
zdiff,zinter,zunion | 求差集、交集、并集 |
# 添加一个或多个元素到sorted set ,如果已经存在则更新其score值 zadd stus 85 jack 45 lucy 98 rose 68 wangsan
# 删除sorted set中的一个指定元素 zrem stus jack
# 获取sorted set中的指定元素的score值 zscore stus jack
# 获取sorted set 中的指定元素的排名,从零开始 zrank stus lucy # 升序 zrevrank stus jack # 降序
# 获取sorted set中的元素个数 zcard stus
# 统计score值在给定范围内的所有元素的个数 zcount stus 45 85
# 按照score排序后,获取指定排名范围内的元素 zrange stus 0 1 # 升序 zrevrange stus 0 1 # 降序
# 让sorted set中的指定元素自增,步长为指定的increment值 zincrby stus 2 jack
# 按照score排序后,获取指定score范围内的元素 zrangebyscore stus 45 87
Bitmaps 本身不是一种数据类型, 实际上它就是字符串(key-value) , 但是它可以对字符串的位进行操作
Bitmaps 单独提供了一套命令, 所以在 Redis 中使用 Bitmaps 和使用字符串的方法不太相同。 可以把 Bitmaps 想象成一个以位为单位的数组, 数组的每个单元只能存储 0 和 1, 数组的下标在 Bitmaps 中叫做偏移量
实例:存储网站每天访问次数
语法:
bitmaps命令 | 说明 |
---|---|
setbit [key] [offset] [value] | 设置Bitmaps中某个偏移量的值(只能是0或1),offset默认从0开始偏移 |
getbit [key] [offset] | 获取Bitmaps中某个偏移量的值 |
bitcount [key] [start end] | 返回字符串被设置为1的个数,例:100001中有2个1 |
setbit users:20210101 1 1 -- 1 setbit users:20210101 6 1 -- 100000 setbit users:20210101 11 1 -- 10000000000
getbit users:20210101 6 -- 获取第6位上的1
Redis HyperLogLog 是用来做基数统计的算法
基数:一个集合中,不重复的数
HyperLogLog 的优点是:在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素
语法:
HyperLog命令 | 说明 |
---|---|
pfadd [key] [value.....] | 向key集合中加入value,添加成功返回1,否则返回0 |
pfcount [key.....] | 统计所选集合们中不重复的个数(所有集合值加在一起不重复) |
pfmerge [destkey] [sourcekey.....] | 将sourcekey集合们的值合并到destkey集合 |
pfadd program "java" pfadd program "java" "C++"
pfcount program
pfmerge hll3 hll1 hll2
Redis 3.2 中增加了对 GEO 类型的支持。GEO,Geographic,地理信息的缩写。该类型,就是元素的 2 维坐标,在地图上就是经纬度。
redis 基于该类型,提供了经纬度设置,查询,范围查询,距离查询,经纬度 Hash 等常见操作
语法:
GEO命令 | 说明 |
---|---|
geoadd [key] [longitude] [latitude] [name]... | 添加地理位置信息到key集合,longitude经度,latitude维度,name名称 |
geopos [key] [name] | 获取key集合中name的经纬度 |
geodist [key] [name1] [name2] | 获取两个位置之间的之直线距离 |
georadius [key] [longitude] [latitude] [num] [unit] | 获取以给定经纬度为中心,num长度,unit单位的半径内的元素 |
geoadd china:city 121.47 31.23 shanghai geoadd china:city 121.47 31.23 shanghai china:city 121.47 31.23 shanghai
geopos china:city shanghai
geopos china:city shanghai beijing
geoadd china:city 121.47 31.23 1000 km