本文目录
- String
- hash
- list
- set
- sorted_set
- 通用命令
- 高级数据类型
- BitMaps类型
- HyperLogLog
- CEO
- Redis的应用场景
本文内容:五个基础类型的基础命令、存储结构与注意事项。三个高级数据类型的应用场景与基础命令。
String
存储结构
基础命令
set key value
get key
del key
mset key1 value key2 value key3 value
mget key1 key2 key3
strlen key
append key value
incr key
incrby key increment //数值可以为负数
incrbyfloat key increment //数值可以为小数
decr key //对应的减少,减少不能减小数
decrby key increment
setex key seconds value //同时设置过期时间
psetex key millisecond value //设置毫秒,重复设置生命周期时,之前的生命周期会被覆盖
注意事项
set 与 mset 的选择
发送多条数据时,理论上mset更高效,但是redis是单线程的,mset保存多条数据时可能会导致线程阻塞
存放数据的方式
1:存储字符
user:id:121:fans -> 1000034
2:存储JSON字符串
set user:id:121 {fans:100034,blogs:100}
两种方式的区别:
第一种方式修改数据时较为方便,但是只能存储一条数据,对于一组数据存储麻烦
第二种方式,存储一组数据时很方便,但是修改数据时比较麻烦,需要全部取出修改。
hash
以上说到string类型数据的两种存储方式,单一存储和对象存储。两者皆有不足,所以推出hash类型
set user:id:121:fans 1000034
set user:id:121:blobs 100
set user:id:121:name chen
以上是一个人的一组信息,我们将user:id:121 抽离出来,作为一个key 将fans blobs name 抽离出来作为一个大的value, 这个大value中,也是key value的形式,我们称之为Hash。
当Hash存储空间中fields较少时,其内部是一个类数组结构,当fields较多时,其内部存储结构使用HashMap结构。
存储结构:
基础命令
hset key field value
hget key field
hgetall key //获取全部 返回fields和value
hdel key field1 [field2] //删除数据
hmset key field1 value1 field2 value2 //添加/修改多个
hmget key field1 field2 field3 //获取多个 仅返回value
hlen key //获取哈希表中字段的数量(fields的数量)
hexists key fields //获取哈希表中是否存在指定的字段
hkeys key //获取哈希表中所有的field
hvals key //获取哈希表中所有的value
hincrby key field increment //增加指定的数值
hincrbyfloat key by increment //增加指定的数值(小数)
注意事项
1:hash类型中的value只能存储字符串类型,不可在value中再嵌套hash类型
2:每个hash可以存储2的32次方减一个键值对
3:hash类型十分贴近对象存储,但不可滥用,将需要的字段存储进redis即可
4:hgetall操作可以获取全部属性,但是当内部fields较多时,遍历整体效率很低,
因此在需要拿多条数据时,可以选择hmget,尽量避免使用hgetall
list
特点:存储多个数据,对进入存储空间的数据标记顺序,list底层的使用双向链表结构
存储结构
基础命令
//添加/修改数据
lpush key value1 value2 ... //从左边进,左头右尾,但实际上左右头尾都是相对的
rpush key value1 value3 ... //从右边进
//获取数据
lrange key start stop //查找范围内的start和stop是索引
lindex key index //根据索引查找
llen key //获取列表长度
**lrange操作时,0表示第一个元素 -1表示最后一个元素,-2表示倒数第二个元素,类推
**lpush是从左边进,lrange是从左边拿,所以他们呢两个配合操作时,数据是反的,
**lrange与rpush配合操作,顺序是一样的
//获取并移除数据
lpop key //从列表左边删除一个元素,并且返回这个元素
rpop key //从列表右边删除一个元素,并且返回这个元素
//list阻塞获取数据 block阻塞
描述:从列表中取出数据,如果当前没有数据,可以等一段时间,如果有数据,就立即取出。
blpop key [key...] timeout //可以让多个列表同时等待,时间单位为秒
brpop key [key...] timeout
应用场景:任务队列,当有队列中有任务时,就取出任务去执行,没有任务时就等待任务的到来
//删除指定元素,因为list是有顺序的,所以list中的元素可能会有重复
lrem key count value
注意事项
1:list中保存的数据是String类型的,保存的数量也是有限的2的32次方减一
2:list具有索引的概念,但主要的操作还是以队列和栈的方式进行操作
3:获取全部数据中结束索引可以设置为-1
4:list可以对数据进行分页操作。通常第一页的数据来自redis,其它的数据从数据库查找
因为一般情况下,第一页就可以解决问题,如淘宝中搜索店铺。
set
需求:存储大量的数据,要求查询效率高
存储结构:与hash的存储结构相同,仅用存储键,不用存储值,并且set中的值不能重复
存储结构
基础命令
//添加数据
sadd key member1 [member2]
//获取全部数据
smembers key
//删除数据
srem key member1 [member2]
//获取集合数据总量
scard key
//判断集合中是是否包含指定数据
sismember key member
//随机从set中拿出count个数据,拿完之后set不变
srandmember key count
//随机从set中剔除一个元素,并返回该元素
spop key
//获取两个结合的交集、并集、差集 应用场景:共同好友,共同关注等
sinter key1 [key2] //交集
sunion key1 [key2]
sdiff key1 [key2] //差集 key1-key2
//获取交集 并集 差集 并且将结果存储到指定集合
sinterstore destination key1 [key2]
sunionstore destination key1 [key2]
sdiffstore destination key1 [key2]
//将指定数据从原始集合中移到指定集合中
smove source destination member
注意事项
1:不能重复,多次添加会失败
2:set和hash结构非常相似,但是 不能将set当作hash使用
应用场景:权限校验,利用set的不可重复和合并操作,可以实现校验权限
sorted_set
需求:可排序的大量数据
存储结构:基于set。在set的基础上,再新增一列(score),作为排序条件列
存储结构
基础命令
//添加数据
zadd key score1 member1 [score2 member2]
//获取全部数据 withscores:是否返回排序依据
zrange key start stop [withscores] //正向排序,sorted_set可以理解为有索引
zrevrange key start stop [withscores] //反向排序
//删除数据
zrem key member [members..] //删除数据时是更具member删除
注意:以下min max通常是用来限定score
start stop 用来限定索引
//按条件获取数据
zrangebyscore key min max [withscore] [limit] //正向排序,limit与mysql用法相同
zrevrangebyscore key max min [withscre] //反向排序
//条件删除数据
zremrangebyrank key start stop //删除索引范围内的member 闭区间
zrevrangebycore key min stop //根据排序条件删除一定范围的数据 闭区间
//获取集合数据总量
zcard key //获取集合中有多少条数据
zcount key min max //获取指定score范围内,集合中的数据数量
//集合的交集、并集操作
zinterstore destination numkeys key1 [key...] [SUM|MIN|MAX]
zunionstore destination numkeys key1 [key...] [sum|min|max]
//对集合进行交并操作,其中numkeys是指对几个集合进行操作,numkey写几,后面就要写
几个key ,min sum max是在合并或求交时的方式,如合并时将数据求和还是求最大等
//获取数据对应的索引(排名)
zrank key member
zrevrank key member
//获取score与修改score
zscore key member
zincreby key increment member
注意事项
1:score保存的数据存储空间时64位
2:score保存的数据是一个双精度的double值,使用双精度时,排序不准确,慎用
3:soreted_set的存储结构基于set,因此数据不能重复,如果重复添加数据,依然会显示
添加失败,但是score值会被最新的值覆盖。
应用场景
1:定时任务的执行顺序或任务过期管理,如会员到期提前提醒与会员到期服务,将用户的到期时间设置到score中,排序后,按照顺序提醒,提醒后将其移除集合,继续提醒下一个
2:解决带有权重的任务将权重设置为score,遇到复杂的权重,可以将权重进行组合
通用命令
key通用命令
//删除key
del key //适用于所有数据类型
//判断key是否存在
exists key
//获取key的类型
type key //string hash list set zset
-------------------------------------------------
时效性控制指令
//设置有效期
expire key seconds
pexpire key millseconds
expireat key timestamp //使用时间戳 linux下使用
pexpireeat key milliseconds-timestamp
获取key的有效时间
ttl key //有三种返回结果
1:返回剩余有效时间
2:已经过期,返回-2
3:没有设置有效期,返回-1
pttl key
//切换key从时效性转换为永久性
persist key
-------------------------------------------------
查询keys
//查询key
keys pattern
pattern的规则:* 查询所有 ?配合一个任意符号 []匹配括号中任意一个符号
如查询以it开头的 keys it*
查询以na开头,m结尾,中间一个任一字符 keys na?m
查询name nbme keys n[ab]me
-------------------------------------------------
其他操作
//为key改名
rename key newkeys //相当于set key,使用时需要注意是否会覆盖其他数据
renamenx key newkeys
//对key进行排序
sort key //只适用于list set sort_set
//其他通用
help @generic
数据库通用命令
key重复的问题
key是有程序员人工定义的,当数据较多,或命名不规范的时候,会出现数据杂乱,key重复
等问题,对此,redis为每个服务提供16个数据库,编号0-15,16个数据库公用一块存储空间
每个数据库之间数据独立。
select index //切换数据库
echo message //输入什么就输出什么,可以用来打印日志
ping //测试服务器是否连通
quit //退出
move key dbindex //移动数据到另一个数据库 剪切操作,移动时需要保证源库中有数据
//并且,目的库没有
flushdb //删除当前库数据
flushall
dbsize //数据库中key的数量
高级数据类型
高级数据类型应用场景相对于基础类型更少,只是针对某些特定场景使用
BitMaps类型
存储简单的状态值 0 1
当我们要存大量的数据时,如果把数据都存为字符类型,每个字符占一个字节,一个字节8位,数据量很大时就需要很大的存储量,当这些数据都是01时,我们可以他存到位中,许多语言都提供操作位的操作,redis也不例外,Bitmaps就是将0 1存每一位上,并且提供操作位的api
getbit key offset //获取指定key对应偏移量上的bit值
setbit key offset value //设置key对应偏移量上的bit
//对指定的key按位进行操作,并储存到新的key中
bitop and|or|not|xor异或| destkey key1 [key2...]
bitcount key [start end] 统计key中1的数量
HyperLogLog
一般用于基数统计
pfadd key element [element...] 添加数据
pfcount key [key..] 返回基数(不重复的个数)
pfmerge destkey sourcekey [sourcekeys..] 合并数据
说明
HyperLogLog用LogLog算法统计一组数据中不重复元素的个数
用于基数统计,不保存具体数据
核心算法是估算算法,数据量大时,会有误差 ,误差范围0.81%
消耗存储空间极小,每个key占用最多12k
pfadd操作不是一开始就分配12k,而是逐渐增加
pfmerge操作后,目标key会直接变成12k
CEO
计算位置距离
存储结构:类似hash,但不同,一个key存储的是一个群组
//geoadd key 经度 维度 名称(坐标点名称)
geoadd key longitude latitude member [longitude latitude member] 添加坐标点
geopos key member [member] 获取坐标点
geodist key member1 member2 [unit] 计算坐标点之间的距离 unit:单位
//获取某个坐标指定范围内的坐标(比如导航时,自己的坐标一直在变化)
georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]
//获取某个点范围内的数据 (获取两个地点的距离,两个点都是固定的)
georadiusbymember key member radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]
//获取指定点对应的坐标hash值
geohash key member [member...]
Redis的应用场景
1:redis可以用于控制数据库主键id,为数据库主键提供生成策略,保障数据库中主键欸唯一
(数据库扩容,分表)
2:redis控制数据生命周期,通过数据是否生效控制业务行为,适用于所有具有时效性
限定控制的操作(投票,没人每小时至多投一票,用redis标记是否已投票)
3:redis应用于 各种结构型和非结构型热度数据访问加速(突然爆火的文章、视频等等)
4:redis应用于购物车数据存储设计
5:redis应用于抢购、限购、限量发送优惠券,激活码等业务数据的存储设计
6:redis应用于具有操作先后顺序的数据控制(使用list实现,如消息队列,任务队列等)
7:redis应用于最新消息展示。
8:redis应用于随机类信息检索,例如热点歌单推荐,热点新闻推荐等。
9:redis应用于同类信息的关联搜索,二度关联搜索,深度关联搜索。
10:redis应用于同类型不同数据的合并
11:redis应用于同类数据的快速去重。
12:redis应用于基于黑名单和白名单设定的服务控制。
13:redis应用于计数器组合排序功能对应的排名(排行榜)
14:redis应用于定时任务执行顺序管理或者任务过期管理(sorted_set的score设置为时间)
15:redis应用于即时任务/消息队列执行管理
16:redis应用于限时按次结算的服务控制。(阿里云短信服务,要求每分钟最多发送10条)
17:redis应用于基于时间顺序的数据操作,而不关注具体时间。(消息列表的先后显示)
19:redis应用于分布式锁对应的业务场景
21:redis应用于状态信息统计(Bitmaps)
22:redis应用于独立信息统计
23:redis用于地理位置计算