Redis简介

特性

  • 为什么快?
  • 基于内存操作,绝大部分操作都是单纯的内存操作,单次的执行会比磁盘快。
  • 命令执行是单线程的。避免了不必要的线程切换和竞争。
  • Redis是一个k-v结构,与hashmap类似,所以查询性能接近O(1)
  • 底层的数据结构做了相关优化,能够提升性能。比如跳表、sds(空间换时间)
  • 网络模型,IO多路复用。
  • C 语言实现,一般来说,C 语言实现的程序“距离”操作系统更近,执行速度相对会更快。
  • 高可用
  1. 完善的内存管理机制。包括过期、淘汰、持久化
  2. 有完善的集群方案。主从、sentinel、cluster集群
  3. redis 是cap中的ap模型,即优先保证可用,所以不能在redis存特别重要的数据。

Redis数据类型以及常用的使用场景

String

  1. String是redis最基础的类型,其中key也是String类型。
  2. String类型最大可以保存512M长度的数据。
  3. 这里的String类型可以是简单字符串、 复杂的xml/json的字符串、二进制图像或者音频的字符串、以及可以是数字的字符串。

基本的指令

set xy 20
get xy
incr xy
incrby xy -2

应用场景

  • 缓存。可以存储字符串、整数或者浮点数
  • 一般而言,一个前端查询请求的耗时>100ms时,是有优化空间的。
  • 存储token,token也有过期时间
  • incr(自增自减),计数相关的场景。如:分布式ID,点赞数,评论数,短信验证次数,库存数。
  • 共享用户session:用户重新刷新一次界面,可能需要访问一下数据进行重新登录,或者访问页面缓存cookie,这两种方式做有一定弊端,1)每次都重新登录效率低下 2)cookie保存在客户端,有安全隐患。这时可以利用redis将用户的session集中管理,在这种模式只需要保证redis的高可用,每次用户session的更新和获取都可以快速完成。大大提高效率。

Hash

基本的指令

hset xy name xuyang
hset xy age 18
hgetall xy
hget xy age

应用场景

  • 缓存对象型的数据。
  • 经常被用来存储用户相关信息。优化用户信息的获取,不需要重复从数据库当中读取,提高系统性能。
  • 统计型的数据

List

基本的指令

  • 用于存储多个、有序的、可重复的列表。
  • 一般用来存储字符串,列表当中的每一个字符看做一个元素。
lpush xylist a
lpush xylist b c
rpush xylist d e
rpop xylist
//范围查询
lrange xylist 0 -1
//blpop:如果xylist中没有元素,则阻塞等待。等待时间为10s。注意blpop不会阻塞其他指令。
blpop xylist 10
brpop xylist 10

应用场景

  • 所有的有序列表
  • 朋友圈
  • 文章列表或者数据分页展示的应用。比如,我们常用的博客网站的文章列表,当用户量越来越多时,而且每一个用户都有自己的文章列表,而且当文章多时,都需要分页展示,这时可以考虑使用redis的列表,列表不但有序同时还支持按照范围内获取元素,可以完美解决分页查询功能。大大提高查询效率。
  • 阻塞消息队列
  • 尽量不要去做

Set

基本的指令

  • 无序、不可重复的集合。但是,如果set中所有的元素都是整型的时候,set是有序的。
  • redis的set类型是使用哈希表构造的,所以添加/删除元素的复杂度接近O(1)。
  • 支持集合内的增删改查, 并且支持多个集合间的交集、并集、差集操作。可以利用这些集合操作,解决程序开发过程当中很多数据集合间的问题。
sadd xyset
smembers xyset a d e c d e
//获取xyset成员数
scard xyset
//随机获取2个元素(元素仍在set中)
srandmember xyset 2
//判断元素e是否在set中,返回1表示在;0表示不在
sismember xyset e
//差集,xyset中,在xyset1不存在的元素集合
sdiff xyset xyset1
//交集
sinter xyset xyset1
//并集
sunion xyset xyset1

应用场景

  • 抽奖
  • 集合类的场景:共同好友

SortSet

基本的指令

  • 有序的、不可重复的集合
zadd xyzset 10 d 5 e 45 c 40 d 35 as
//范围查询,按序
zrange xyzset 0 -1
//范围查询,反序
zrevrange xyzset 0 -1
//查询所有元素,带分数
ZRANGE xyzset 0 -1 withscores
//按分类范围查询,闭区间[20-40]
zrangebyscore xyzset 20 40
//查询元素分数
zscore xyzset d
//修改元素的分数
zincrby xyzset 60 d

应用场景

  • 排行榜

BitMap

基本的指令

位图

setbit xybit 5 1
setbit xybit 10 1
getbit xybit 10
bitcount xybit

应用场景

  • 能统计访问情况
  • 做权限

参考资料