文章目录
常用数据类型
- string
- hash
- list
- set
- sorted_set
Redis
以key-value
的形式存储数据,通常都是以字符串格式存储
一、string类型基本操作
set key value
: 设置字符串get key
: 获取内容del key
: 删除内容mset key1 value1 key2 value2 ...
: 批量设置mget key1 key2 ...
: 批量获取strlen key
: 获取内容字符长度append key value
: 在目标内容后增加新内容
string类型扩展操作
string作为数值操作:
incr key
: 目标内容加1incrby key increment
: 目标内容加上给定值(可正可负)incrfloat key float
: 目标内容加上给定浮点数decr key
: 目标内容减1decrby key increment
: 目标内容减定值(可正可负)decrfloat key float
: 目标内容减给定浮点数
- string在redis内部默认存储为字符串, 遇到加减操作时会转化为数值类型计算
- redis所有操作都是原子性的, 采用单线程处理所有业务, 在一个redis中不用考虑并发数据影响
- 注意: 如果string不能转化成数值类型或者数值溢出(最大long), 会报错
设置数据生命周期:
setex key seconds value
psetex key milliseconds value
注意事项:
- 返回结果表示运行是否成功:
(integer)0
: 失败(integer)1
: 成功
- 表示运行结果的值:
(integer)3
: 3或者3个(integer)1
: 1(个)
- 数据不存在:
(nil)
: null
- 数据最大存储量:
- 512MB
- 数值计算最大范围(long)
- 64位有符号数long类型
redis应用于各种结构型和非结构型高热度数据的访问加速
- 命名规范: 如
tablename:primarykeyname:keyvalue:fieldname
来保存目标field的数据 - 对于同一个对象的不同属性, 可以分别存储, 也可以以JSON格式存储:
{field1:value, field2:value...}
, 区别则是前者可以单独获取/更新一条属性, 后者会全部获取/更新
二、hash类型
使用string存储同一个对象的多个属性时, 存取都不方便, 所以有了hash类型的需求
- hash类型底层使用哈希表结构实现数据存储, 使用字符串key存储一个hash数据, 数据内部分为不同的field和value
- 优化:
- field较少时, 存储结构优化为类数组结构,
- field较多时, 存储结构为HashMap类型
hash类型数据的基本操作
hset key field value
: 添加/修改数据hget key field
/hgetall key
: 获取数据hdel key field1 [field2...]
: 删除数据hmset key field1 value1 field2 value2...
: 多数据操作hmget key field1 field2...
hlen key
: 获取键中字段数量hexists key field
: 判断键中是否存在指定字段hsetnx key field value
: 字段不存在时设置, 若已存在则返回失败
hash类型数据扩展操作
hkeys
key: 获取键中所有字段hvals
key: 获取键中所有字段的值hincrby
key field increment: 操作指定字段加上给定数值hincrbyfloat
key field float: 操作指定字段加上给定数值
hash类型操作注意事项
- hash类型中的value只能存储字符串, 不允许其它类型和嵌套, 不存在的数据返回
(nil)
- 理论上每个hash可以存储232 - 1个键值对
- hash类型可以按对象的数据格式存储数据,但应该尽量避免大量使用hash类型
hgetall
可以获取一个键的所有字段, 但如果内部field过多, 会十分影响效率。
hash类型和string类型的json数据: hash注重对字段的更新, json注重对全部数据的读取
三、list类型
- 按顺序存储, 使用双向链表实现
lpush
key value1 value2 : 左入数据rpush
key value1 value2 : 右入数据lrange
key start stop : 从左向右获取数据[start, stop], 可以使用负索引(类比Python切片)lindex
key index : 获取单个元素llen
key : 获取指定列表长度lpop
key : 左出数据rpop
key : 右出数据blpop
key timeout : 阻塞式获取数据, 为空时阻塞, timeout超时返回brpop
key timeoutlrem
key count value : 在列表中移除给定数量的value值
list类型数据的注意事项
- list中数据以string格式存储, 理论最大元素个数为232 - 1
- list具有索引的概念, 但双向链表尽量不使用索引, 通常使用左/右弹出数据
- 获取全部数据-1索引表示最后一个元素
- list通常对分页数据存储第一页内容, 其余从数据库加载
- list顺序结构, 可以利用数据先后顺序进行简单的时间排序
四、set类型
set
与hash
的关系, 类比Java中HashSet
与HashMap
的关系- 仅存储键, 不存储值(nil)
sadd
key member1 [member2] : 添加数据smembers
key : 获取全部数据srem
key member1 [member2]: 删除数据scard
key : 获取集合数据总量sismember
key member : 判断集合中是否存在指定数据
set类型数据扩展操作
-
srandmember
key [count] : 从集合中随机获取数据 -
spop
key [count]: 从集合中随机弹出数据- 常用于随机随机检索、推荐。
-
sinter
key1 [key2] : 集合交集 -
sunion
key1 [key2] : 集合并集 -
sdiff
key1 [key2] : 集合差集 -
sinterstore
destination key1 [key2] : 求集合交集并保存到指定集合 -
sunionstore
destination key1 [key2] : 集合并集并保存到指定集合 -
sdiffstore
destination key1 [key2] : 集合差集并保存到指定集合 -
smove
source destination member : 将指定数据从原集合移动到目标集合- 常用于同类信息的关联搜索、二度关联搜索、深度关联搜索
set类型数据注意事项
set
集合不允许重复数据, 重复数据会失败- 可以利用set集合对数据去重处理,如网站访问流量:用户流量,IP流量
五、sorted_set类型
zadd
key score1 member1 [score2, member2] : 添加数据zrange
key start stop [withsocres
] : 获取指定范围的数据(从小到大)zrevrange
key start stop [WITHSCORES
] : 获取指定范围的数据(从大到小)zrem
key member [member1] : 删除数据
sorted_set基本操作
zrangebyscore
key min max [withscores
] [limit
] : 按排序条件获取数据zrevrangebyscore
key min max [withscores
] [limit
] : 按排序条件获取数据反序zremrangebyrank
key start stop : 按排序位置删除数据zremrangebyscore
key min max : 按排序条件删除数据zcard
key : 获取全集合数量zcount
key min max : 获取区间数量zinterstore
destination munkeys key [key…] : 交集zunionstore
destination munkeys key [key…] : 并集- 交集还可以使用聚合函数sum|min|max(默认是sum效果)
zinterscore zz 3 z1 z2 z3 aggregate max
;zrang 0 -1 zz withscores
sorted_set类型扩展操作
zrank
key member : 获取数据的对应排名zrevrank
key member : 反序排名zscore
key member : 获取数据排序score条件zincrby
key increment member : 指定数据加
sorted_set类型注意事项
- 排序条件score的存储空间为64位
- score数据支持双精度double数据, 但要注意浮点数的精度问题
sorted_set
是基于set
类型的, 数据不能重复添加, 但score会被最后一次覆盖sorted_set
可以用于时间过期任务处理, 使用时间戳作为score, 每次处理最顶端的数据time
指令获取当前系统时间sorted_set
集合也可以处理带权重的数据
使用帮助
使用redis时,对某个指令用法不清楚,可以使用help 指令
在交互式客户端查看帮助文档,也可以在官方文档查找帮助