Redis#1——Redis的基本使用
1 Redis基本操作
1.1 帮助命令
2 redis应用场景
3 String
3.1 基本操作
3.2 key的设置约定:
3.3 String类型的扩展操作
3.4 String作为数值操作
hash
hash存储优化
基本操作
扩展操作
hash类型数据操作的注意事项
业务场景
list
list类型数据基本操作
扩展操作
list类型数据操作注意事项
set
set类型数据基本操作
扩展操作
set类型数据操作的注意事项
应用场景
sorted_set
sorted_set类型数据的基本操作
扩展操作
sorted_set类型数据操作的注意事项
sorted_set类型应用场景
综合实践
计数器
redis通用指令
key的通用操作
db的通用操作
Redis基础
1 Redis基本操作
1.1 帮助命令
Redis官方为我们提供了一套帮助命令
help 命令名称
help @组名
2 redis应用场景
redis用户控制数据库表主键id,为数据库表主键提供生成策略,保障数据库表的主键唯一性。 redis控制数据的生命周期,通过数据是否失效控制业务行为,适用于所有具有时效性限定控制的操作 redis应用于各种结构型和非结构型高热度数据访问加速 redis应用于购物车数据存储设计 redis应用于抢购,限购类、限量发送优惠卷、激活码等业务得到数据存储设计 redis应用于具有操作先后顺序的数据控制 redis应用于最新消息展示 redis应用于随机推荐类信息检索,例如热点歌单推荐,热点新闻推荐,大V推荐等 redis应用于同类信息的关联搜索,二度关联搜索,深度关联搜索 redis应用于同类型不重复数据的合并、取交集操作 redis应用于同类型数据的快速去重 redis应用于基于黑名单和白名单设定的服务控制 redis应用于定时任务执行顺序或任务过期管理(sorted_set) redis应用于即时按次结算的服务控制 redis应用于计数器组合排序功能对应的排名 redis应用于即使任务/消息队列执行管理 redis应用于基于时间顺序的数据操作,而不关注具体时间
3 String
存储单个数据,是最简单数据结构
3.1 基本操作
添加/修改数据
set key value
获取数据
get key
删除数据(成功返回修改的个数,为1成功,为0失败)
del key
添加、 修改索格数据
mset key1 value1 key2 value2 ...
获取多个数据
mget key1 key2 ...
获取字符串长度
strlen key
追加信息到原始信息后部(返回追加完的长度)
append key value
“单数据和多数据操作之间怎么选择?
单指令是将数据一条一条发送,而多指令一条指令即可完成。多指令传输效率比较高。但是如果一条指令中的数据过长,需要即时切割
3.2 key的设置约定:
表名:主键名:主键值:字段名
eg:order : id : 1234 : name
3.3 String类型的扩展操作
# 设置数值数据增加指定范围
incr key
incrby key increment
incrbyfloat key increment
# 设置数值数据减少范围的值
decr key
decrby key increment
# 设置数据具有声明周期
setex key seconds value # 设置秒
psetex key milliseconds value # 设置毫秒
3.4 String作为数值操作
string在redis内部存储默认就是一个字符串,当遇到递减类操作incr,decr时会转成数值型进行运算 redis所有的操作都是原子性的,采用单线程处理所有业务; string的最大类型时Javalong型数据最大值
hash
hash存储优化
如果一个key中的field比较少,存储结构优化为类数组结构
如果field较多,存储结构使用hashmap结构
基本操作
添加/修改数据
hset key field value
获取数据
hget key field
hgetall key
删除数据
hdel key field1 [field2]
添加/修改多个数据
hmset ket field1 value1 field2 value2...
获取多个数据
hmset key field1 field2 ...
获取哈希表中的字段数量
hlen key
获取哈希表中是否存在指定的字段
hexists key field
扩展操作
获取哈希表中所有的字段名或字段值
hkeys key
hvals key
设置指定字段的数值数据增加指定范围的值
hincrby key field increment
hincrbyfloat key field increment
hash类型数据操作的注意事项
hash类型下的value只能存储字符串,不允许存储其他类型。数据未获取到,对应的值是(nil) 每个hash可以存储2^31^-1个键值对 hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计的初衷不是为了存储大量对象,不可滥用(用哪个存哪个) hgetall操作可以获取全部属性,如果内部field过多,遍历整体数据的效率会很低,有可能成为数据访问的瓶颈(用哪个取哪个)
业务场景
电商网站购物车的设计与实现
业务分析
仅分析购物车的redis存储模型 添加、浏览、更改数量、删除、清空 购物车与数据库间持久化同步 购物车与订单间关系 提交购物车:读取数据生成订单 商家临时价格调整:隶属于订单级别 未登录用户购物车信息存储 cookie存储
解决方案
以用户id作为key,每位用户创建一个hash存储结构 将商品编号作为field,购买数量作为value进行存储 添加商品:追加全新的field和value 浏览:遍历hash 更改数量:自增/自减,设置value值 删除商品:删除field 清空:删除key 大量重复信息可以独立建立hash(通过hsetnx可以节省空间,提高效率)
如果有值则不存放,没值才存放
hsetnx key field value
list
底层使用双向链表(有序)
list类型数据基本操作
添加/修改数据
lpush key value1 [value2]
rpush key value1 [value2]
获取数据
lrange key start stop #查看所有数据stop赋值为-1
lindex key index
llen key
获取并移除数据
lpop key
rpop key
扩展操作
规定时间内获取并移除数据
blpop key1 [key2] timeout
brpop key1 [key2] timeout
移除指定数据
lrem key count value
list类型数据操作注意事项
list中保存的数据都是string类型,数据容量是有限的,最多2^32^-1个元素 list具有索引的概念,但是操作数据时通常以队列的形式进行入队出队操作,或以栈的形式进行入栈出栈操作 获取全部数据操作结束索引设置为-1 list可以对数据进行分页操作,通常第一页的信息来自于list,第二页及更多的信息通过数据库的形式加载
set
存储大量数据,高效的内部存储机构,便于查询
set类型:与hash存储结构完全相同,仅储存value,不存key,即将field放入value(不允许重复)
set类型数据基本操作
添加数据
sadd key member1 [member2]
获取全部数据
smembers key
删除数据
srem key member1 [member2]
获取集合数据总量
scard key
判断集合中是否包含指定数据
sismember key number
扩展操作
业务场景
系统为了用户留存度,为用户随机推送热点信息
随机获取集合中指定数量的数据
srandmember key [count]
随机获取集合中的某个数据并将该数据移出集合
spop key
系统为用户推荐人际圈,确定推送内容
求两个集合的交、并、差集
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虽然与hash结构相似,但是不能调用hash value的存储空间
应用场景
业务场景
黑名单、白名单
解决方案
基于经营策略设定问题用户发现、鉴别规则 周期性更新满足规则的用户黑名单,加入set集合 用户行为信息达到后于黑名单进行比对 通过剔除用户ip地址、用户id、用户设备id等信息拦截用户
sorted_set
新的存储要求:数据排序有利于数据的有效展示,需要提供一种根据自身特征进行排序的方式
需要的存储结构:新的存储模型,可以保存可排序的字段
sorted_set类型:在set的存储结构基础上添加可排序字段
sorted_set类型数据的基本操作
添加数据
zadd key score1 member1 [score2 member2 ...]
获取全部数据
zrange ket start stop [WITHSCORES] #从小到大
zrevrange ket start stop [WITHSCORES] #从大到小
删除数据
zrem key number [number]...
按条件获取数据
zrangebyscore key min max [WITHSCORES] [LIMIT]
zrevrangebyscore key max min [WITHSCORES]
条件删除数据
zremrangebyrank key start stop
zremrangebyscore key min max
获取集合数据总量
zcard key
zcount key min max
集合交、并操作
zinterstore destination numkey key [key...]
zunionstore destination numket ket [key...]
扩展操作
业务场景
各类投票、资源网站的排序
解决方案
获取数据对应的索引
zrank key member #从小到大
zrevrank key member #从大到小
score值获取与修改
zscore key member
zincrby key increment member
sorted_set类型数据操作的注意事项
score保存的数据存储空间是64位,如果是整数范围是-9007199254740992~9007199254740992 score保存的数据也可以是双精度的double值,使用要慎重 sorted_set底层存储还是基于set结构,因此数据不能重复,如果重复会覆盖保存
sorted_set类型应用场景
业务场景
基础服务+增值服务类网站会设定各位会用的使用,让用户体验会员优势。当VIP体验到期后,需要有效管理此类信息
各种拥有时效性质的任务
解决方案
对于基于时间线限定的任务处理,将处理时间记录为score值,利用排序功能区分处理的先后顺序 记录下一个要处理的时间,当到期后处理对应任务,移除redis的任务 当新任务加入时,判定并更新当前下一个要处理任务的时间 为提升性能,通常将任务根据特征存储成若干个sorted_set,如月度、季度、年度等
获取系统时间
time
业务场景
任务/消息权重设定应用
当任务或者消息待处理,形成了任务队列或消息队列时,对于高优先级的任务要保障对其优先处理,如何实现任务权重管理。
解决方案
使用score记录权重
综合实践
计数器
一段时间之内只能调用固定次数的情景
解决方案
设计计数器,记录调用次数。以用户id作为key,使用次数作为value 在调用前获取次数 不超过,每次调用计数+1 超过了,业务调用失败,计数-1 为计数器设置生命周期为指定周期,自动清空周期内使用次数
改良
取消最大值的判定,利用incr操作超过最大值抛出异常的形式替代每次判断是否达到最大值 判断是否为nil 如果是,设置为Max-次数 如果不是,计数+1 业务调用失败,计数-1 抛出异常视为达到最大值
redis通用指令
key的通用操作
删除指定key
del key
获取key是否存在
exists key
获取key的类型
type key
为指定key设置有效期
expire key seconds # s
pexpire key milliseconds # ms
expireat key timestamp # 时间戳
expireat key milliseconds-timestamp
获取key的有效时间
ttl key # 不存在返回-2,永久存在返回-1
pttl key
切换key从时效性转换为永久性
persisy key
key查询功能
key pattern # *:匹配任意数量的任意符号、?匹配一个任意符号、[]匹配一个指定符号
为key改名
rename key newkey
renamenx key newkey
对所有key排序
sort
db的通用操作
redis为每个服务提供16个数据库[0,15]
切换数据库
select index
其他操作
quit
ping
echo message #日志
数据移动
move key db
数据清楚
dbsize
flushdb
flushall





