Redis

概念:

Redis(Remote Dictionary  Server)是C语言开发的一个开源的高性能键值对数据库。

特征:

1. 数据间没有必然的关联联系。
2. 内部采用单线程机制进行工作。
3. 高性能。官方提供测试数据,50个并发执行100000个请求,读的速度是110000次/s,写的速度是80000次/s。
4. 多数据类型支持
       ①字符串类型     string
       ②列表类型         list
       ③散列类型   hash
       ④集合类型   set
       ⑤有序集合类型  sorted_set
5. 持久化支持,可以进行数据灾难恢复

Redis的应用

1. 为热点数据加速查询(主要场景),如热点商品、热点新闻、热点资讯、推广类等高访问量信息等
2. 任务队列,如秒杀、抢购、购票排队等
3. 即时信息查询,如各位排行榜、各类网站访问统计、公交到站信息、在线人数信息(聊天室、网站)、设备信号等
4. 时效性信息控制,如验证码控制、投票控制等
5. 分布式数据共享,如分布式集群架构中的session分离
6. 消息队列
7. 分布式锁

windows版本下载

https://github.com/microsoftarchive/redis/tags

一、String类型

String类型数据的基本操作

1.添加/修改数据  set  key value    
2.获取数据     get  key
3.删除数据    del  key
4.添加/修改多个数据    mset  key1  value1  key2   value2  ...
5.获取多个数据    mget key1  key2...
6.获取数据字符长度(字符串的长度)    strlen   key  
7.key 不存在时,为 key 设置指定的值  setnx key value
8.追加信息到延时信息后部(如果原始信息存在就追加,否则新建)append  key  value

string 类型数据的拓展操作

业务场景1

大型企业级应用中,分表操作是基本操作,使用多张表存储同类型数据,但是对应的主键id必须保持统一性,不能重复。Oracle数据库具有sequence设定,可以解决该问题,但是Mysql数据库并不具有类似的机制,那么该如何解决。

解决方案

1. 设置数值数据增加指定范围的值
incr  key     默认增加1
incrby  key  increment    指定增加的整数值
incrbyfloat  key  increment    指定增加的小数值

2. 设置数值数据减少指定范围的值
decr  key     默认减少1
decrby  key  increment    指定减少的整数值

string作为数值操作

1.string在redis内部存储默认就是一个字符串,当遇到增减类操作incr、decr时会转为数值型进行计算。
2. redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发带来的数据影响。

注意:按键值进行操作的数据,如果原始数据不能转为数值或超越了redis数值上限范围将报错。9223372036854775807(java中long型数据最大值,long_MAX_VALUE)

Tips1:
1. redis用于控制数据库表主键id,为数据库表主键提供生成策略,保障数据库表的主键唯一性。
2. 次方案适用于所有的数据库,且支持数据库集群。

业务场景2

‘最强女生’启动海选投票,只能通过微信投票,每个微信号每4小时只能投一票。
电商商家开启热门商品推荐,热门商品不能一直处于热门期,每种商品热门期维持三天,三天后自动取消热门。
新闻网站出现热点新闻,热点新闻最大的特征是时效性,如何自动控制热点新闻的时效性。

解决方案

设置数据具有指定的生命周期
setex  key  seconds  value
psetex  key  milliseconds  value
Tip 2:
redis控制数据的生命周期,通过数据是否失效控制业务行为,适用于所有具有时效性限定控制的操作。

业务场景3

image.png

解决方案

1.在redis中为大V用户设定用户信息,以用户主键和属性值作为key,后台设定定时刷新策略即可
        eg:   user:id:356894:fans          ->  122222
        eg:    user:id:555214:blogs        ->568
        eg:    user:id:125689:focuss      ->83
例如:set user:id:356894:fans 122222
2. 在redis中以json格式存储大V用户信息,定时刷新(也可以使用hash类型)
       eg:  user:id:35555465            ->{fans:122222,blogs:568,focuss:83}
例如:set user:id:35555465 {fans:122222,blogs:568,focuss:83}
Tip 3:
redis应用于各种结构型和非结构型高热度数据访问加速

key的设置约定

数据库中的热点数据key命名惯例
             表名  :  主键名    :主键值   :字段名
     eg:    user:id:123456:name

string 类型数据操作的注意事项

1. 数据操作不成功的反馈与数据正常操作之间的差异
①表示运行结果是否成功
(Integer)0  ->false   失败
(Integer)1  ->true   成功
②表示运行结果值
(Integer)3  ->3    3个
2. 数据未获取到
  (nil)等同于null
3. 数据最大存储量
   512MB
4. 数值计算的最大范围值(java中的long的最大值)
  9223372036854775807

二、hash类型

image.png

image.png

hash类型数据的基本操作

1. 添加/修改数据   hset key field value
2. 获取数据 hget key field     hgetall key(获取所有数据)
3. 删除数据 hdel key field1 [field2]
4. 添加/修改多个数据  hmset key field1 value1 field2 value2 ...
5. 获取多个数据 hmget key field1 field2 ...
6. 获取哈希表中字段的数量 hlen key
7. 获取哈希表中是否存在指定的字段  hexists key field

hash 类型数据的扩展操作

1. 获取哈希表中所有的字段名或字段值
hkeys key
hvals key
2.设置指定字段的数值数据增加指定范围的值
hincrby key field increment     increment代表数值(整数)
hincrbyfloat key field increment      increment代表数值(小数)

hash 类型数据操作的注意事项

1. hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到,对应的值为nil。
2. 每个hash可以存储2的32次方减1个键值对。
3. hash类型十分接近对象的数据存储形式,并且可以灵活的添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计的,切记不可滥用,
更不可以将hash作为对象列表使用
4. hgetall操作可以获取全部属性,如果内部的field过多,遍历整体数据效率就会很低,有可能成为数据访问瓶颈。

hash 类型的应用场景

业务场景1

电商网站购物车的实现


image.png
解决方案
1. 以客户id作为key,每位客户创建一个hash存储结构存储对应的购物车信息
2. 将商品编号作为field,购买数量作为value进行存储
3. 添加商品:追加全新的field和value
4. 浏览:遍历hash
5. 更改数量:自增/自减,设置value值
6. 删除商品:删除field
7. 清空:删除key
image.png
hsetnx key field value  field值不存在就新增否则不变

业务场景2

image.png

解决方案

1. 以商家id作为key
2. 将参与抢购的商品id作为field
3. 将参与抢购的商品数量作为对应的value
4. 抢购时使用降值的方式控制产品数量

三、list类型

image.png

list 类型数据基本操作

1. 添加/修改数据  
 lpush key value1 [value2]...
 rpush key value1 [value2]...
2. 获取数据
 lrange key start stop   start和stop指索引位置 lrange key 0 -1 获取全部数据
 lindex key index
 llen key
3. 获取并移除数据(每执行一次获取一个值)
 lpop key (按最先从左边插入的数据依次获取数值,然后从列表中将其删除)
 rpop key (按最先从右边插入的数据依次获取数值,然后从列表中将其删除)

list 类型数据拓展操作

规定时间内获取并移除数据
blpop key1 [key2] timeout   timeout指时间(s)
brpop key1 [key2] timeout
注:如果获取不到会一直等到规定时间结束后返回,如果有数据会立马获取到。key1 [key2] 表示可以多个list一起查找

list 类型数据扩展操作

业务场景1

微信朋友圈点赞,要求按照点赞顺序显示好友信息
如果取消点赞,移除对应好友信息


image.png
解决方案
移除指定数据
lrem key count value     count指要移除的值的个数  
tips 6:
redis 应用于具有操作先后顺序的数据控制

list 类型数据注意事项

image.png

set 类型

image.png

set 数据类型基本操作

1. 添加数据
sadd key member1 [member2]
2. 获取全部数据
smembers key
3. 删除数据
srem key member1 [member2
4. 获取集合数据总量
scard key
5. 判断集合中是否包含指定数据
sismember key member]

set 类型数据的扩展操作

业务场景1

image.png
解决方案
1. 随机获取集合中指定数量的数据
srandmember key [count]
2. 随机获取集合中的某个数据并将该数据移出集合
spop key

业务场景2

image.png

解决方案

1. 求两个集合的交、并、差集
sinter key1 [key2]
sunion key1 [key2]
sdiff key1 [key2]    key1 key2顺序不一样结果也不一样
2. 求两个集合的交、并、差集并存储到指定集合中
sinterstore destination key1 [key2]
sunionstore  destination key1 [key2]
sdiffstore destination key1 [key2]
destination指的是指定的集合,key1、key2代表两个集合
3. 将指定数据从原始集合中移动到目标集合中
smove source destination member
source指的是从哪移的集合
destination指的是要移过去集合
member指的是移哪个值

业务场景3

image.png

解决方案

1. 依赖set集合数据不重复的特征,依赖set集合hash存储结构特征完成数据过滤与快速查询
2. 根据用户id获取用户所有角色
3. 根据用户所有角色获取用户所有操作权限放入set集合
4. 根据用户所有角色获取用户所有数据全选放入set集合
tip:
redis应用于同类型不重复数据的合并操作

业务场景4

image.png

解决方案

1. 利用set集合的数据去重特征,记录各种访问数据
2. 建立string类型数据,利用incr统计日访问量(PV)
3. 建立set模型,记录不同的cookie数量(UV)
4. 建立set模型,记录不同IP数量(IP)
tip:
redis应用于同类型数据的快速去重

set类型数据操作的注意事项

image.png

sorted_set类型

image.png

sorted_set 类型数据的基本操作

1. 添加数据
zadd key score1 member [score2 member2]

2. 获取全部数据
zrange key start stop [WITHSCORES]  按score值从小到大排序 
zrevrange key start stop [WITHSCORES] 按score值从大到小排序
zrange key start stop withscores 返回值包含score值和member值一起输出
zrange key start stop  返回值只有member值

3. 删除数据
zrem key member [member ...]

4. 按条件获取数据
zrangebyscore key min max [WITHSCORES] [limit]
zrevrangebyscore key min max [WITHSCORES]
eg: zrangebyscore key min max limit 0 3 withscores  获取三条数据

5.条件删除数据
zremrangebyrank key start stop
zremrangebyscore key min max

6. 获取集合数据总量
zcard key
zcount key min max

7. 集合交、并操作
zinterstore destination numkeys key [key...]
zunionstore destination numkeys key [key...]
destination指的是交、并后的集合名
numkeys指的是有几个集合交、并
numkeys值为几,后面就需要有几个集合
注意:
1. min与max用于限定搜索查询的条件
2. start 与stop用于限定查询范围,作用于索引,表示开始和结束索引
3. offset与count用于限定查询范围,作用于查询结果,表示开始位置和数据总量

sorted_set 类型数据的扩展操作

业务场景1

image.png

解决方案

1. 获取数据对应的索引(排名)
zrank key member
zrevrank key member
2. score值获取与修改
zscore key member
zincrby key increment member
tip:
redis应用于计数器组合排序功能的对应排名

业务场景2

image.png

解决方案

image.png
获取系统时间   time
tip:
redis应用于定时任务执行顺序管理或任务过期管理

业务场景3

image.png

解决方案

image.png

sorted_set 类型数据操作的注意事项

image.png

key通用操作

key基本操作

1.  删除指定key  del key
2. 获取key是否存在   exists key
3. 获取key的类型   type key

key拓展操作(时效性控制)

1. 为指定key设置有效期
expire key seconds
pexpire key milliseconds
有效期为时间戳
expireat key timestamp  
pexpireat key milliseconds-timestamp

2. 获取key的有效时间
ttl key   当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以秒为单位,返回 key 的剩余生存时间。
pttl key

3.切换key从时效性转换为永久性
persist key

4.  查询key
keys pattern  pattern指查询匹配规则
查询匹配规则
   * 匹配任意数量的任意字符   
   ? 匹配一个任意符号
   [] 匹配一个指定符号
例如:
keys *           查询所有
keys it*         查询所有以it开头
keys *it         查询所有以it结尾
keys ??it        查询所有前面两个任意字符,后面以it结尾
keys user:?      查询所有以user:开头,最后一个字符任意
keys u[st]er:1   查询所有以u开头,以er:1结尾,中间包含一个字母,s或t

key其他操作

1. 为key改名
rename key newkey    注意:newkey的值如果存在执行后会覆盖,相当于执行set操作
renamenx key newkey  注意:newkey的值如果存在执行失败,不存在才能成功

2. 对所有key排序(适用于list、set、sorted_set)
sort key

3. 其他key通用操作
help @generic

数据库通用指令

image.png

db 基本操作

1. 切换数据库
select index   index值是0-15 默认操作的库是0

2. 其他操作
quit
ping     通过此命令可以判断与服务器是否连通,如果连通会返回pong
echo message

db 相关操作

1. 数据移动(移动删除操作,本库指定的key值删除)
move key db    db指库的索引值(0-15)
注意:
  本库必须存在该key值否则移动失败
  移到其他库必须保证要移动的库里不存在要移的key否则移动失败
2. 数据清除
dbsize  查看库里所有key的数量
flushdb   删除本库的的所有数据
flushall   删除所有库里的所有数据

Linux环境下启动redis

image.png

image.png

image.png
在Redis内,我们可以使用EXPIRE或EXPIREAT设置key的过期时间,Redis内存达到maxmemory限制后,Redis内存就会施行过期数据淘汰策略。
过期删除策略通常有三种:定时删除、惰性删除、定期删除,目前Redis使用的过期键删除策略为惰性删除和定期删除,两种策略配合使用。

惰性删除,指当某个key值过期之后,该key值不会马上被删除,只有当读或者写一个已经过期的key时,才会触发惰性删除策略,此时该key完成删除。

定期删除,指每隔一段时间就会扫描一定数量数据库的expires字典内一定数量的key,并删除里面过期的key。

由于惰性删除无法保证过期数据被及时删除掉,所以Redis采用惰性删除,定期删除相结合的方法,
可以帮助实现定期主动淘汰已过期的key,从而使cpu和内存资源达到最优的平衡效果。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容