文章目录

  • 1. Redis数据类型
  • 2. String类型
    • 2.1 String基本信息
    • 2.2 常用命令
    • 2.3 业务场景
      • 2.3.1 String类型作为数值时的增减
      • 2.3.2 String 数据时效性设置
      • 2.3.3 String类型之高热度数据访问加速
  • 3. Hash类型
    • 3.1. Hash基本信息
    • 3.2. 常用命令
    • 3.3. 业务场景
      • 3.3.1. 电商网站购物车的设计与实现
      • 3.3.2. Hash实现抢购,限购发放优惠券,激活码等
  • 4. List类型
    • 4.1. List基本信息
    • 4.2. 常用命令
    • 4.3. 业务场景
      • 4.3.1. 微信朋友圈点赞,要求按照点赞顺序显示点赞好友信息。如果取消点赞,移除对应好友信息。
      • 4.3.2. 最新消息的展示
  • 5. Set类型
    • 5.1. Set基本信息
    • 5.2 常用命令
    • 5.3. 业务场景
      • 5.3.1. 随机操作数据
      • 5.3.2. 共同好友
      • 5.3.3. 同类型不重复数据的合并操作
      • 5.3.4. 访问量统计去重
      • 5.3.5. 黑白名单
  • 6. sorted_set类型(zset)
    • 6.1. zset基本信息
    • 6.2. 常用命令
    • 6.3. 业务场景
      • 6.3.1. 建立排序依据
      • 6.3.2. 会员短期体验之过期失效
  • 7. 数据类型实践案例
    • 7.1. 按次调用-计数器
    • 7.2. 微信会话
  • 8. 应用总结
  • 9. 心得体会
    • 9.1. 为什么用redis
    • 9.2. 用什么数据类型

1. Redis数据类型

五种redis数据类型与java的模型进行类比- string --> String
- hash --> Hashmap
- list --> LinkList
- set --> HashSet
- sorted_set --> TreeSetredis自身是一个Map类型的存储方式,其中所有的数据都是采用key:value的形式
存储因此提到redis数据类型指的都是存储的数据的类型,也就是value部分的类型,
key部分永远都是字符串

2. String类型

2.1 String基本信息

存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型
存储数据的格式:一个存储空间保存一个数据
存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作
使用(但是仍是字符串)

2.2 常用命令

//添加/修改数据
set key value//获取数据
get key//删除数据
del key//添加/修改多个数据
mset key1 valueq key2 value2 …//获取多个数据
mget key1 key2 …//获取数据字符个数(字符串长度)
strlen key//追加信息到原始信息后部(如果原始信息存在就追加,否则新建)
append key value



2.3 业务场景

2.3.1 String类型作为数值时的增减

  1. 大型企业级应用中,分表操作是基本操作,使用多张表存储同类型数据,但是对应的主键id必须保证统一性,不能重复。
    Oracle数据库具有sequence设定,可以解决该问题,但是MySQL数据库并不具有类似的机制,那么如何解决?
  2. 解决思路:使用自增自减(应该还有别的方法,只要id不同即可,雪花算法)
  • 设置数值数据增加指定范围的值

    incr key          //自增1
    incrby key increment  //增加指定数值
    incrbyfloat key increment  //增加一个浮点数
    

  • 设置数值数据减少指定范围的值

    decr key            //自减1
    decrby key increment //减少指定数值
    

  • String作为数值操作时的注意事项

    string在redis内部存储默认就是一个字符串,当遇到增减类操作incr,decr
    时会转成数值型进行计算redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执
    行的,因此无需考虑并发带来的数据影响。按数值进行操作的数据,如果原始数据不能转成数值,或超过了redis数值上线
    范围,将会报错。9223372036854775807 (java中long型数据最大值,
    Long.MAX_VALUE)
    

2.3.2 String 数据时效性设置

  1. 场景一:“某某综艺”,启动海选投票,只能通过微信投票,每个微信号每4个小时只能投1票。
  2. 场景二:电商商家开启热门商品推荐,热门商品不能一直处于热门期,每种商品热门期维持3天,3天后自动取消热门
  3. 场景三:新闻网站会出现热点新闻,热点新闻最大的特征是对时效性,如何自动控制热点新闻的时效性
  4. 解决思路:给用户设置一个唯一的id,并为其设置一个有效时长,当时间已经超过设定时间后将id删除。
  • 设置数据具有指定的声明周期
    redis 控制数据的生命周期,通过数据是否失效控制业务行为,适用于所有具有时效性限定控制的操作:

    setex key seconds value //增加、修改键值对并为其设定生命周期
    psetex key milliseconds value //功能与上面一直,秒的单位不同
    

  • String 类型的注意事项:数据操作成功与否的反馈
     1、表示运行结果是否成功(integer)0 –> false 失败(integer)1 –> true 成功2、表示运行结果值(integer)3 –> 3 3个(integer)1 –> 1 1个数据未获取到
    

    (nil)等同于null

2.3.3 String类型之高热度数据访问加速

  1. 主页高频访问信息显示控制,例如微博大V主页显示粉丝数与微博数量,这些数据就是热度数据,不断发生变化,这些数据如何放入Redis?
  2. 解决思路:设置时间定时刷新
  • 在Redis中为大V用户设定用户信息,以用户主键和属性值作为key,后台设定时间定时刷新即可。

    • user: id :5765898790:focuss:3050
    • user: id :5765898790:fans:117492300
    • user: id :5765898790:blogs:117744
  • 在Redis中以json格式存储大V用户,定时刷新。
    • set user: id :5765898790 {id:5765898790,focuss:3050,fans:117492300,blogs:117744}

3. Hash类型

3.1. Hash基本信息

String类型存储的困惑:
对象类数据的存储如果具有较为频繁的更新需求,操作会显得笨重,存容易,改麻烦。为了修改对象类型的数据更方便,因此引入hash类型:
为了区别与Redis中的键值对的称呼,hash中的键称为field,而key永远特指
Redis的键。新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息
需要的内存结构:一个存储空间保存多少个键值对数据
hash类型:底层使用哈希表结构实现数据存储hash类型下的value只能存储字符串,不允许存储其他类型数据,不存在嵌套现象。如
果数据未获取到,对应的值为(nil)
每个hash可以存储232-1个键值对
hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计
不是为了存储大量对象的,切记不可滥用,更不可以将hash作为对象列表使用
hgetall操作可以获取全部属性,如果内部fiekd过多,遍历整体数据效率就会很低,有可
能成为数据访问瓶颈。

3.2. 常用命令

//添加/修改数据
hset key field value//获取数据
hget key field
hgetall key//删除数据
hdel key field1 [field2]//添加/修改多个数据
hmset key field1 value1 field2 calue2//获取多个数据
hmget key field1 field2 …//获取哈希表中字段的数量
hlen key//获取哈希表中是否存在指定的字段
hexists key field//获取哈希表中所有的字段名和字段值
hkeys key //字段名
hvals key //字段值//设置指定字段的数值数据增加指定范围的值
hincrby key field increment //指定数值增长指定的数
hincrbyfloat key field increment//创建数据,如果有则不再创建,如果没有则创建
hsetnx key field value



3.3. 业务场景

3.3.1. 电商网站购物车的设计与实现


  1. 例如创建一个购物车:
  2. 当前仅仅是将数据存储到redis中,并没有起到加速的所用,因为我们仅仅查询到了用户的id和商品的id,显示的时候显示的用户名和商品的名称,商品信息还需要二次查询数据库。
    • 每条购物车中的商品记录保存成两条field
    • field1 专用于保存购买数量
      1、命名格式:商品id:nums
      2、保存数据:数值
    • field2 专用于保存购物车中显示的信息,包含文字描述,图片地址,所属商家信息等等
      1、命名格式:商品id:info
      2、保存数据:json

      但是出现很多用户都将同一个商品假如购物车,就会出现大量的重复信息,例如商品信息重复:

      因此我们可以将商品的信息单独的保存成一个哈希。

3.3.2. Hash实现抢购,限购发放优惠券,激活码等

  • 解决方案

    • 以商家id作为key
    • 将参与抢购的商品id作为field
    • 将参与抢购的商品数量作为对应的value
    • 抢购时使用降至的方式控制产品数量

4. List类型

4.1. List基本信息

数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分
需要的存储数据:一个存储空间保存多个数据,且通过数据可以体现进入顺序
list类型:保存多个数据,底层使用双向链表存储结构实现list类型数据操作注意事项
list 中保存的数据都是string类型的,数据总容量式是有限的,最多232-1个元素
(4294967295)
list具有索引的概念,但是操作数据时候通常以队列的形式进行入队出队操作,
或以栈的形式进入栈出栈的操作
获取全部数据操作结束索引设置为-1
list 可以对数据进行分页操作,通过第一页的信息来自list,第2页及更多的信息
通过数据库的形式加载

4.2. 常用命令

//添加/修改数据
lpush key value1 [value2] …
rpush key value1 [value2] …//获取数据
lrange key start stop //获取从左数第start到stop个元素,从0开始
lindex key index //查询第i个元素
llen key //list的长度//获取并移除数据
lpop key //获取并删除左边第一个元素
rpop key //获取并删除右边第一个元素//list 类型数组扩展操作
//规定时间内获取并移除数据
blpop key1 [key2] timeout
brpop key1 [key2] timeout


阻塞式获取,在规定时间内获取这个值,规定时间内如果还没有的时候可以等,直到
有值就可以获取到获取超时获取为空。
开两个客户端,一个设置15s内获取list1中的值,此时list1位空一直等待(阻塞),
在15秒内另一个客户端存入到list1中数据,此时就被获取到。

4.3. 业务场景

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

  • 解决方案

    //移除指定数据
    lrem key count value //count为移除的数量,value为移除哪个值
    

4.3.2. 最新消息的展示

  • twitter、新浪微博、腾讯微博中个人用于的关注列表需要按照用户的关注顺序进行展示,粉丝列表需要将最近关注的粉丝列在前面
  • 新闻、资讯类网站如何将最新的新闻或资讯按照发生的事件顺序展示
  • 企业运营过程中,系统将产生出大量的运营数据,如何保障堕胎服务器操作日志的统一顺序输出?

解决方案

  • 依赖list的数据具有顺序的特征对信息进行管理
  • 使用队列模型解决多路信息汇总合并的问题
  • 使用栈模型解决最新消息的问题

5. Set类型

5.1. Set基本信息

新的存储需求:存储大量的数据,在查询方面提供更高的效率
需要的存储结构:能够保存大量的数据,搞笑的内部存储机制,便于查询
set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值式不允许
重复的。也就是只有键没有值的hashset类型不允许数据重复,如果添加的数据在set中已经存在,将只保留一份
set虽然与hash的存储结构相同,但是无法启用hash中存储值的空间

5.2 常用命令

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

5.3. 业务场景

5.3.1. 随机操作数据

  • 每位用户首次使用进入头条时候会设置3项爱好的内容,但是后期为了增加用户的活跃度,兴趣点,必须让用户对其他信息类别逐渐产生兴趣,增加客户留存度,如何实现?
  • 业务分析
    • 系统分析出各个分类的最新或最热点信息条目并组织成set集合
    • 随机挑选其中部分信息
    • 配合用户关注信息分类中的热点信息组织展示的全信息集合
  • 解决方案
    //随机获取集合中指定数量的数据
    srandmember key [count]//随机获取集合中的某个数据并将该数据移出集合
    spop key
    

  • redis应用于随机推荐类信息检索,例如热点歌单推荐,热点新闻推荐,热点旅游线路,应用APP推荐,大V推荐等。

5.3.2. 共同好友

  • 解决方案:利用集合的交、并、差集

    //求两个集合的交、并、差集
    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
    
  • redis应用于同类信息的关联搜索,二度关联搜索,深度关联搜索
    1. 显示共同关注(一度)
    2. 显示共同好友(一度)
    3. 由用户A出发,获取到好友用户B的好友信息列表(一度)
    4. 由用户A出发,获取到好友用户B的购物清单列表(二度)
    5. 由用户A出发,获取到好友用户B的游戏充值列表(二度)

5.3.3. 同类型不重复数据的合并操作


5.3.4. 访问量统计去重

5.3.5. 黑白名单

6. sorted_set类型(zset)

6.1. zset基本信息

新的存储需求:根据排序有利于数据的有效显示,需要提供一种可以根据自身特征进
行排序的方式。
需要的存储结构:新的存储模型,可以保存可排序的数据。
sorted_set类型:在set的存储结构基础上添加可排序字段。score只存储其顺序。
score 保存的数据存储空间是64位
score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可
能会丢失精度,使用时侯要慎重
sorted_set底层存储还是基于set结构的,因此数据不能重复,如果重复添加相
同的数据,score值将被反复覆盖,保留最后一次修改的结果

6.2. 常用命令

//添加数据
zadd key score1 member1 [score2 member2]//获取全部数据
zrange key start stop [WITHSCORES]//按照从小到大的顺序,加上WITHSCORES,就会带上scores一起显示
zrevrange key start stop [WITHSCORES]//按照从大到小的顺序//删除数据
zrem key member [member …]//按条件获取数据
//查询scores在某个范围内的值
zrangebyscore key min max [WITHSCORES] [LIMIT]
//查询key某个索引范围内的值
zrevrangebyscore key max min [WITHSCORES]//条件删除
zremrangebyrank key start stop
zremrangebyscore key min max//注意--------------------------------------------
min与max用于限定搜索查询的条件
start与stop用于限定查询范围,作用于索引,表示开始和结束索引
offset与count用于限定查询范围,作用于查询结果,表示开始位置和数据总量//获取集合数据总量
zcard key //获取总量
zcount key min max //获取某一个范围的总量//集合交、并存储操作
zinterstore destination numkeys key [key …] //求和
zunionstore destination numkeys key [key …]


6.3. 业务场景

6.3.1. 建立排序依据


6.3.2. 会员短期体验之过期失效

7. 数据类型实践案例

7.1. 按次调用-计数器

  • 解决方案

    • 设计计数器,记录调用次数,用于控制业务执行次数。以用户id作为key,使用此时作为value
    • 在调用前获取次数,判断是否超过限定次数,不超过次数的情况下,每次调用计数+1,业务调用失败,不递增
    • 为了计数器设置生命周期为指定周期,例如10次/分钟,自动清空周期内使用次数。


7.2. 微信会话

8. 应用总结

9. 心得体会

9.1. 为什么用redis

  • 只要你的数据在mysql等关系型数据库无法存储,或者说存取花费的时间超过了你的忍受程度,那么就可以选择redis,redis的特点就是快,基于内存,单线程,数据结构丰富,并且每种数据都有其特性,方便各种应用场景。

9.2. 用什么数据类型

  • key:首先说redis的key值,相比mysql的特性

    • 计时,可以设定多久删除掉,或者查询剩余有效时间
    • 随机值,返回一个随机的key
    • 增量迭代,将key的值增量迭代
  • String:普通字符串,没什么特点,基础结构。存储单个值,利用的特殊二进制,删存也挺快
    • 除key的特性外没什么特性
  • hash:对象结构,适合多field数据。有多个字段的数据类型,时间复杂度O(1)
    • 删除或者增加field值、查看field是否存在、遍历field等等
    • 其实大多都是对field的操作。
  • list:链表,有序,可重复,双向链表结构
    • 适合增删、毕竟双向链表
    • 大部分都是增删和存取,拿出并删除等等。
  • set:hash表,无序,不可重复,其实就是只有field没有value的hash。交并差集。
    • 交集!
    • 并集!
    • 差集!
  • zset:和set唯一的区别就是有序。
    • 利用一个分数,但是用的不多。
    • 分数相同时,按照插入顺序排列,因为本身有序,然后按分数。


有些文档说,集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)其实不太准确。

其实在redis sorted sets里面当items内容大于64的时候同时使用了hash和skiplist两种设计实现。这也会为了排序和查找性能做的优化。所以如上可知: 添加和删除都需要修改skiplist,所以复杂度为O(log(n))。 但是如果仅仅是查找元素的话可以直接使用hash,其复杂度为O(1) 其他的range操作复杂度一般为O(log(n))当然如果是小于64的时候,因为是采用了ziplist的设计,其时间复杂度为O(n)

复习专栏之---数据库(redis)相关推荐

  1. TechTarget数据库Redis

    2019独角兽企业重金招聘Python工程师标准>>> http://www.searchdatabase.com.cn/topic/redis.htm Redis NoSQL标准缺 ...

  2. redis数据库价格_阿里云数据库Redis购买流程

    下面介绍的阿里云数据库Redis购买流程已失效(因阿里云已改版),不必看了. 1.登录阿里云官网,进入控制台-阿里云数据库Redis . 2.在实例列表页, 点击[购买阿里云数据库Redis]按钮,进 ...

  3. NoSQL数据库Redis使用命令简介

    NoSQL 数据库Redis使用命令简介 NOSQL数据库可以按照它们的数据模型分成4类: 1.键-值对存储库(Key-Value) redis-- 2.BigTable实现(BigTable-imp ...

  4. 从事前到事后,云数据库 Redis MongoDB 安全体系全揭秘!

    作者:陈金元(今远),阿里云管控技术专家 一.整体说明 上图是云数据库Redis&MongoDB的安全体系图,横向是实例控制链路,纵向是实例数据链路,对于控制链路,事前为了避免恶意操作或者误操 ...

  5. 入门云数据库Redis,满足你的高读写性能场景需求

    什么是云数据库Redis版 更新时间:2020-01-16 10:30:56 编辑 我的收藏 新浪微博 微信 钉钉 我的收藏 SDK中心 API中心 新手学堂 学习路径 本页目录 为什么选择云数据库R ...

  6. 腾讯云数据库Redis助力百万企业远程办公

    受疫情影响,多数企业员工目前无法回到写字楼办公,学生推迟开学,稳定高效的远程办公和直播授课成为2020年的开年刚需.腾讯从1月24日开始向全国免费开放可支持300人同时在线会议的"腾讯会议& ...

  7. 技术解读丨分布式缓存数据库Redis大KEY问题定位及优化建议

    摘要:如何定位分布式缓存数据库Redis大KEY问题,实操案例带你掌握优化方法. [背景] 访问Redis 5.0 cluster集群出现OOM报错,报错信息为(error) OOM command ...

  8. Java后端--25--内存数据库Redis讲解

    一.Redis简介 redis是Nosql数据库中使用较为广泛的非关系型内存数据库,redis内部是一个key-value存储系统.它支持存储的value类型相对更多,包括string(字符串).li ...

  9. 添加lua_非关系型数据库Redis之Lua脚本

    [本文详细介绍了非关系型数据库Redis中Lua脚本的基本概念和使用方法,欢迎读者朋友们阅读.转发和收藏!] 1 Lua 简介 Lua 是一个小巧的脚本语言,其设计目的是为了嵌入应用程序中,从而为应用 ...

最新文章

  1. 全球 Top 1000 计算机科学家 h 指数公布,中国顶尖计算机科学家人数进入前三
  2. WPF 设置类库项目为启动项,设置窗体跟随。
  3. .NET BitmapImage 内存释放问题解决方案
  4. Android反编工具的使用-Android Killer
  5. oracle使用max提升效率,Oracle调优之利用max与leftjoin来进行不同表之间匹配
  6. VAE(变分自编码器)学习笔记
  7. 20151208_使用windows2012配置weblogic节点管理器
  8. 【转】Java Socket编程基础及深入讲解
  9. linux tar 大小不同,linux – 如何在使用tar时设置bzip2块大小?
  10. css列表大全,CSS中li列表样式汇总大全,全实例展示
  11. php gaufrette,php – 使用Gaufrette Stream Wrappers和AsseticBundle
  12. php include_once 路径,php使用include加密路径的方法介绍
  13. 西南交通大学计算机应用基础,西南交通大学计算机应用基础作业-客观部分
  14. STVD cpstm8 miss } in struct/union definition
  15. vscode远端编程 终极方案
  16. 朱义晨作业 17037099
  17. JVM垃圾收集器-Parallel Scavenge收集器
  18. 什么是运动控制,工业控制与自动化领域中运动控制器的作用是什么?- 顶控科技
  19. 2055 到淄博旅游
  20. c语言字符串dna,DNA (C语言代码)

热门文章

  1. EasyPoi快速入门
  2. Gatling学习笔记(四)---脚本编写及功能介绍
  3. 2018最新传智黑马39期WEB前端开发全套教程
  4. html添加表格内添加背景图片,如何在Excel2013表格中为数据区域添加背景图片的方法...
  5. 如何查找一个图片的当地地址
  6. 使用Modbus TCP协议连接安川PLC
  7. curl多线程批量请求
  8. 分享个Minecraft 模组打开GUI的代码
  9. 微信小程序开发初试实例结算小助手
  10. JavaScript 中按键事件所对应 键盘码