本文目录

  • String
  • hash
  • list
  • set
  • sorted_set
  • 通用命令
  • 高级数据类型
  • BitMaps类型
  • HyperLogLog
  • CEO
  • Redis的应用场景



本文内容:五个基础类型的基础命令、存储结构与注意事项。三个高级数据类型的应用场景与基础命令。

String

存储结构

redis tag系统 redismset_hyperloglog

基础命令

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结构。

存储结构:

redis tag系统 redismset_ceo_02


基础命令

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底层的使用双向链表结构

存储结构

redis tag系统 redismset_bitmap_03


基础命令

//添加/修改数据
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中的值不能重复

存储结构

redis tag系统 redismset_redis_04


基础命令

//添加数据
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),作为排序条件列

存储结构

redis tag系统 redismset_hyperloglog_05


基础命令

//添加数据
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用于地理位置计算