目录
1.redis的数据结构:
-
redis存储的是:key,value格式的数据,其中key都是字符串,value常用的有8种不同的数据结构
-
value的数据结构:
基本数据结构 说明 字符串类型 String String 哈希类型 Hash map格式 列表类型 List linkedlist格式。支持重复元素 集合类型 Set 不允许重复元素 有序集合类型 SortedSet 不允许重复元素,且元素有顺序 特殊数据结构 说明 Geo 存储的地理位置的经纬度 BitMap 本身不是一种数据类型, 实际上它就是字符串,可以实现对位的操作 HyperLog Redis HyperLogLog 是用来做基数统计的算法
2.命令操作:
1.通用命令:
格式 | 说明 |
---|---|
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
2.String类型:
-
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
3.Hash类型:
-
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
4.List类型:
-
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
5.集合类型 set:
-
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
6.有序集合类型 sortedset:
-
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
7.位操作Bitmaps:
-
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
8.基数统计HyperLog:
-
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
9.经纬度GEO:
-
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