版本 redis 5.0.8,Redis可视化工具为Redis Desktop Manager
8种数据类型
Redis5中提供了8种数据类型:
- string:最基本的数据类型,二进制安全的字符串(也就是string可以包含任何数据:图片、序列化对象等),最大512M,我们最常用的key-value键值对就是使用string类型
- list:按照插入顺序的字符串列表,类似于链表LinkedList
- set:无序的字符串集合,不存在重复的元素。
- sorted set(Zset):对set的补充,是排序的字符串集合。
- hash:key-value对的一种集合,常用于存储对象,可以看出具有key和value的map容器
- bitmap:位图,更细化的一种操作,以bit为单位,通过bit来进行0或者1的设置,表示某个元素对应的值或者状态
- hyperloglog:基于概率的数据结构(基数统计)
- Geo:地理位置信息储存起来, 并对这些信息进行操作
最常用的是前5种:String、Hash、List、Set、Zset
后面3种仅在特定的情况下使用
后续基于SpringBoot/Lettuce验证Redis的相关数据类型,不清楚的可以看:SpringBoot - 整合Redis:解析Lettuce与RedisTemplate封装
操作Key
数据类型是值value,key都是string类型,是该数据的唯一标识
Redis提供了操作key值的命令:
-
DEL key 该命令用于在 key 存在时删除 key。
-
DUMP key 序列化给定 key ,并返回被序列化的值。
-
EXISTS key 检查给定 key 是否存在。
-
EXPIRE key seconds 为给定 key 设置过期时间(以秒计)
-
PEXPIRE key milliseconds 设置 key 的过期时间以毫秒计。
-
TTL key 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)
-
PTTL key 以毫秒为单位返回 key 的剩余的过期时间。
-
PERSIST key 移除 key 的过期时间,key 将持久保持。
-
KEYS pattern(keys 通配符 ) 查找所有符合给定模式( pattern)的 key
获取所有与pattern匹配的key,返回所有与该匹配通配符: * 代表所有 ,也可以直接查找字符 -
RENAME key newkey 修改Key的名称
-
MOVE key db 将当前数据库的 key 移动到给定的数据库 db 当中
-
TYPE key 返回 key 所储存的值的类型
基本就是对应的英文
String
最基本的key-value键值对就是string类型
赋值
- set key value
设置给定 key 的值,如果key已经存储值,set就覆写旧值,且无视类型
set name zhangsan
- mset key value [key value]
批量设置
- setnx(set if not exists)
只有在key不存在时设置 key 的值,setnx(set if not exists) 命令在指定的 key 不存在时,为 key 设置指定的值,是解决分布式锁的方案之一
SETNX key value
取值
get key
取得指定key值
获得key为name的值:get name
getrange key start end
获取存储在指定key中字符串的子字符串
获得key为name的值的0~4子字符串
getbit key offset
对 key 所储存的字符串值,获取指定偏移量上的位(bit)mget key1 [key2..]
获取所有(一个或多个)给定 key 的值
当想要查找多个值时不能仅使用get
getset key value
getset 命令用于设置指定key的值,并返回key的旧值,当 key 不存在时,返回null
strlen key
返回 key 所储存的字符串值的长度
删除
del key
删除指定的key,如果存在,返回值数字类型。
自增/自减
incr key
Incr 命令将key中储存的数字值增1。如果key不存在,那么key的值会先被初始化为 0 ,然后再执行incr操作
incrby key 增量值
Incrby 命令将key中储存的数字加上指定的增量值
自减:
decr key
decrby key 减值
decr命令将key中储存的数字减1/减值
如果存储的不是数字会报错
字符串拼接
append key value
append命令用于为指定的key追加value至未尾,如果不存在,为其赋值
SpringBoot中相关操作
- Jedis
Jedis比较简单,函数名与Redis命令相同:set、get、exists等,String类型对应set/get函数,Hash类型对应hset/hget函数。。。
- Lettuce
SpringBoot提供RedisTemplate封装Lettuce,Redis的命令与相关函数不同
RedisTemplate通过操作类对不同数据类型进行操作,ValueOperations操作类对应String类型,通过valueOps操作
Hash
hash是一个string类型的field和value的映射表
key为user,value为[name:zhangsan,id:1,age:22],类似与存放一个user对象,属性为name,id,age
类似与Json字符串:
{
"user": {
"name":"zhangsan",
"id":"1",
"age":"22"
}
}
相关命令
Hash类型的命令是在String类型的基础上加上H做区分:
- 赋值:hset、hsetnx、hmset
- 取值:hget获得hash表中一个指定属性、hmget获得一个或多个属性,hgetAll返回HASH表中所有的字段和值
还有hkeys、hlen
HGET KEY FIELD //获取存储在HASH中的值,根据FIELD得到VALUE
HMGET key field[field1] //获取key所有给定字段的值
HGETALL key //返回HASH表中所有的字段和值
HKEYS key //获取所有哈希表中的字段
对于Hash类型,keys只能得到key,hkeys可以得到hash字段
- 删除:hdel
hdel key field [filed...]
当然也可以通过del user直接删除该键值对
- 自增、自减
HINCRBY key field increment
为哈希表 key 中的指定字段的整数值加上增量 increment,设置increment为负数即自减
HINCRBYFLOAT key field increment
为哈希表 key 中的指定字段的浮点数值加上增量 increment
- 其他:
hexists key field
查看哈希表 key 中,指定的字段是否存在,存在为1,不存在为0
hlen key
获取哈希表中字段的数量
hvals key
获取hash表中所有的value
hscan key cursor [match] [count]
取值查看,cursor:游标-基于游标获取数据,match:匹配指定的key,count:每次读取的个数,没有即默认的读取1个;分片的读取数据可以有效的防治一次性读入超量数据导致内存撑爆
Springboot相关操作
-
Jedis:函数和命令名相同
hset、hget等函数
-
Lettuce
使用RedisTemplate封装,redisTemplate.opsForHash()
即可调出相关操作,通过HashOperations操作
有这些方法:put函数为hset命令
对应的操作:
List
List:简单的字符串列表,按照插入顺序排序
Hash是在value存储对象(key-value),List就是在value存储列表(value)
List相关命令
List命令以L开头,通过push插入、pop取出
- 赋值:Lpush、Lpushnx将一个或多个值从列表头插入(左插入)
Rpush、Rpushnx将一个或多个值从列表尾插入(右插入)
Lset key index value
通过索引设置列表元素的值
Linsert key BEFORE|AFTER world value
在列表的元素前或者后插入元素
描述:将值 value 插入到列表 key 当中,位于值 world 之前或之后
- 取值:Llen、Lindex、Lrange
LLEN key //获取列表长度
LINDEX key index //通过索引获取列表中的元素
LRANGE key start end //获取列表指定范围内的元素
其中可以用负数表示下标,即从列表尾往前数,-1为最后一个元素
- 删除:
LPOP key
移出并获取列表的第一个元素(从左侧删除)
RPOP key
移除并获取列表的最后一个元素(从右侧删除)
BLPOP/BRPOP key1 [key2 ] timeout
移出并获取列表的第一个/最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
LTRIM key start end
对一个列表进行修剪(trim),让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除
- 移动元素:
RPOPLPUSH source destination
移除列表的最后一个元素,并将该元素添加到另一个列表并返回
BRPOPLPUSH source destination timeout
从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
Springboot中list相关操作
list通常用来实现一个消息队列,而且可以确保先后顺序,例如存储top5的文章
- Jedis
与前面相同,函数名和命令名相同
- Lettuce
RedisTemplate封装Lettuce,通过ListOperations类操作
ListOperations操作类:
用left表示左操作,right表示右操作,对应命令里的l、R
Set
和Java的Set一样,Redis的Set是String类型的无序集合,集合成员是唯一的
Redis中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)
底层为intset(整数集合)和hashtable(hash表)
相关命令
- 赋值语法:
SADD key member1 [member2] 向集合添加一个或多个成员
因为无序,所以只需插入,不用管从哪插入
- 取值语法:
SCARD key //获取集合的成员数
SMEMBERS key //返回集合中的所有成员
SISMEMBER key member //判断 member 元素是否是集合key的成员,0Wie不存在,1存在
SRANDMEMBER key [count] //随机返回集合中元素(count个)
- 删除语法:
SREM key member1 [member2] //移除remove集合中一个或多个成员
SPOP key [count] //移除并返回集合中的一个随机元素
SMOVE source destination member //将member元素从 source 集合移动到 destination 集合
- 集合操作:
差集:diff
SDIFF key1 [key2] 返回给定所有集合的差集(与左侧集合比较)
SDIFFSTORE destination key1 [key2] 返回给定所有集合的差集并存储在destination 中
交集:inter
SINTER key1 [key2] 返回给定所有集合的交集
SINTERSTORE destination key1 [key2] 返回给定所有集合的交集并存储在 destination 中
并集:union
SUNION key1 [key2] 返回所有给定集合的并集
SUNIONSTORE destination key1 [key2] 所有给定集合的并集存储在 destination 集合中
Springboot中set操作
- Jedis
- Lettuce
SetOperations操作类
difference差集、intersect交集、union并集
Zset(sorted set)
有序集合sorted set,因为命令开头为Z,通常称为Zset
对set的补充,有序集合,通过添加double类型的分数score排序
与Set性质一样,有序集合的成员是唯一的,但分数(score)却可以重复
Zset相关命令
- 赋值语法:
ZADD key score1 member1 [score2 member2] //向有序集合添加一个或多个成员,或者更新已存在成员的分数
- 取值语法:
ZCARD key //获取有序集合的成员数
ZCOUNT key min max //计算在有序集合中指定区间分数的成员数
ZRANK key member //返回有序集合中指定成员的索引
ZRANGE key start end [WITHSCORES] //通过索引区间返回有序集合成指定区间内的成员(低到高)
ZREVRANGE key start end [WITHSCORES] //返回有序集中指定区间内的成员,通过索引,分数从高到底
- 删除语法:
del key //移除集合
ZREM key member [member ...] //移除有序集合中的一个或多个成员
ZRemRangeByRank key start end //移除有序集合中给定的排名区间的所有成员(第一名是0)(低到高排序)
ZRemRangeByScore key min max //移除有序集合中给定的分数区间的所有成员
- 自增、自减
这里是自增分数,加负数就是自减了
zincrby key increment member
将zhang的分数+5
Springboot中Zset相关操作
-
Jedis
函数名与命令名相同
-
Lettuce
SpringBoot提供了ZSetOperations操作类
HyperLogLog
HyperLogLog数据类型用于基数统计的算法
什么是基数?
如果数据集{1,2,3,4,4,3,5}
,该数据集的基数集为{1,2,3,4,5}
,基数(不重复元素)为5
基数估计:在误差可接受的范围内,快速计算基数
Redis是在内存中运行,当有很大的数据要进行基数基数:1亿个数据的基数基数 10^8 / 8 / 1024 /1024 ≈ 12 M
使用HyperLogLog,每个键只需12kb内存就可以计算2^64个不同元素,在输入元素数量、体积非常大时,计算基数所需的空间是固定的
HyperLogLog会根据输入元素来计算基数,而不会存储输入元素本身
相关命令
以pf开头:
pfadd key element[element...] //添加指定元素到HyperLogLog
pfcount key [key...] //返回给定HyperLogLog的基数估计数
prmarge destkey sourcekey[sourcekey...] //将多个HyperLogLog(sourcekey)合并为一个HyperLogLog(destkey)
Springboot中相关操作
- Jedis
- Lettuce
HyperLogLogOperations操作类
因为HyperLogLog特定用于基数计算,如统计浏览网站访客,所以使用并不多
Geo
Gep是指定的地理空间位置(纬度、经度、名称)
将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。这些数据将会存储到sorted set(Zset),这样的目的是为了方便使用GeoRadius或者GeoRadiusByMember命令对数据进行半径查询等操作
相关命令
geoadd key 经度 纬度 city
以Zset存储
Geopos key city
:获得该地的坐标值
geodist key city1 city2 长度单位
获取两个位置之间的距离
-
GeoHash key city[city...]
返回一个或多个位置元素的 Geohash 表示
-
GeoRadius key 给定经度 给定纬度 半径 长度单位 [返回额外的信息]
以给定的经纬度为中心, 找出某一半径内的元素
长度单位有:m 、km 、mi(英里)、ft(英尺)
额外信息:
-
WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致
-
WITHCOORD: 将位置元素的经度和维度也一并返回
-
WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。
这个选项主要用于底层应用或者调试, 实际中的作用并不大
命令默认返回未排序的位置元素。 通过以下两个参数, 用户可以指定被返回位置元素的排序方式:
- ASC: 根据中心的位置, 按照从近到远的方式返回位置元素
- DESC: 根据中心的位置, 按照从远到近的方式返回位置元素
GeoRadiusByMember key member 半径 长度单位
和GeoRadius类似,只是GeoRadiusByMember以某个元素为圆心
Springboot中相关操作
- Jedis
同样的函数名
- Lettuce
GeoOperations操作类
其中红色的是不建议使用的(可以用但不推荐),Springboot希望函数名都是相同的,添加方法就是add,不区分数据类型
geoadd等方法会加上删除线
bitmap
位图,更细化的一种操作,以bit为单位,通过bit来进行0或者1的设置,表示某个元素对应的值或者状态
相关操作
- 赋值
setbit key 序号 状态(0/1)
例如设置签到记录,0~4的5天签到情况
- 取值
getbit key 序号
- 统计
bitcount key [start] [end]
5天里签到了4天
- 位运算
bitop [operations] [result] [key1] [keyn…]
//operations:位运算操作,result:结果存储位置
//key :参与运算的key
bitmap以bit为单位,提供了位运算operations:AND 与运算 &、OR 或运算 | 、XOR 异或 ^ 、NOT 取反 ~ (与或非、异或)
例如:设置num1=110,num2=101
and :100
or : 111
Springboot中相关操作
-
Jedis
同样的函数名和命令名相同
-
Lettuce
在redisTemplate封装中,bitmap相关操作在ValueOperations