Redis简介、数据类型与应用场景

Redis 是一款高性能的键值对内存数据库,提供多种数据类型如字符串、列表、集合、有序集合、哈希等。它常用于存储短暂数据、缓存、分布式锁、计数器、消息队列等场景。例如,使用String类型实现乐观锁和分布式锁,List类型作为栈或队列,Set用于存储唯一元素,SortedSet进行排序和排行榜,Hash类型存储对象,而Bitmap则用于位操作。Redis还支持Stream类型,提供消息队列功能。

Redis简介、数据类型与应用场景

什么是Redis

  • Redis (Remote Dictionary Server)远程字典服务器,是用C语言开发的一个开源的高性能键值对( key-value )内存数据库.
  • 它提供了五种常用数据类型来存储值:字符串类型、散列类型、列表类型、集合类型、有序集合类型
  • 它是一种 NoSQL 数据存储

Redis发展历史

2008年,意大利的一家创业公司 Merzia 推出了一款基于 MySQL 的网站实时统计系统 LLOOGG ,然而没过多久该公司的创始人 Salvatore Sanfilippo ( antirez)便 对MySQL的性能感到失望,于是他决定亲自为 LLOOGG 量身定做一个数据库,并于2009年开发完成,这个数据库就是Redis。

Redis2.6
Redis2.6在2012年正式发布,主要特性如下:
服务端支持Lua脚本、去掉虚拟内存相关功能、键的过期时间支持毫秒、从节点提供只读功能、两个新的位图命令:bitcount和bitop、重构了大量的核心代码、优化了大量的命令。

Redis2.8
Redis2.8在2013年11月22日正式发布,主要特性如下:
添加部分主从复制(增量复制)的功能、可以用bind命令绑定多个IP地址、Redis设置了明显的进程名、发布订阅添加了pubsub命令、Redis Sentinel生产可用

Redis3.0
Redis3.0在2015年4月1日正式发布,相比于Redis2.8主要特性如下:
Redis Cluster:Redis的官方分布式实现(Ruby)、全新的对象编码结果、lru算法大幅提升、部分命令的性能提升

Redis3.2
Redis3.2在2016年5月6日正式发布,相比于Redis3.0主要特征如下:
添加GEO相关功能、SDS在速度和节省空间上都做了优化、新的List编码类型:quicklist、从节点读取过期数据保证一致性、Lua脚本功能增强等

Redis4.0
Redis4.0在2017年7月发布,主要特性如下:
提供了模块系统,方便第三方开发者拓展Redis的功能、PSYNC2.0:优化了之前版本中,主从节点切换必然引起全量复制的问题、提供了新的缓存剔除算法:LFU(Last Frequently Used),并对已有算法进行了优化、提供了RDB-AOF混合持久化格式等

Redis数据类型与应用场景

Redis是一个Key-Value的存储系统,使用ANSI C语言编写。

key的类型是字符串。

value的数据类型有:
常用的:string字符串类型、list列表类型、set集合类型、sortedset(zset)有序集合类型、hash类型。

不常见的:bitmap位图类型、geo地理位置类型。

Redis5.0新增一种:stream类型

注意:Redis中命令是忽略大小写,(set SET),key是不忽略大小写的 (NAME name)

Redis的Key的设计
  1. 用:分割
  2. 把表名转换为key前缀, 比如: user:
  3. 第二段放置主键值
  4. 第三段放置列名

比如:用户表user, 转换为redis的key-value存储

useridusernamepasswordemail
9zhangf111111zhangf@126.com

username的key: user:9:username
email的key: user:9:email

这样做的好处是:

  • 表示明确:看key知道意思
  • 不易被覆盖
string字符串类型

Redis的String能表达3种值的类型:字符串、整数、浮点数 100.01 是个六位的串
常见操作命令如下表:

命令名称命令描述
setset key value赋值
getget key取值
getsetgetset key value取值并赋值
setnxsetnx key value当value不存在时采用赋值,set key value NX PX 3000 原子操作,px设置毫秒数
appendappend key value向尾部追加值
strlenstrlen key获取字符串长度
incrincr key递增数字
incrbyincrby key increment增加指定的整数
decrdecr key递减数字
decrbydecrby key decrement减少指定的整数

应用场景:

  1. key和命令是字符串
  2. 普通的赋值
  3. incr用于乐观锁。incr:递增数字,可用于实现乐观锁 watch(事务)
  4. setnx用于分布式锁。当value不存在时采用赋值,可用于实现分布式锁

举例:
setnx:

127.0.0.1:6379> setnx name zhangf #如果name不存在赋值
(integer) 1
127.0.0.1:6379> setnx name zhaoyun #再次赋值失败
(integer) 0
127.0.0.1:6379> get name
"zhangf"

set

127.0.0.1:6379> set age 18 NX PX 10000 #如果不存在赋值 有效期10秒
OK
127.0.0.1:6379> set age 20 NX #赋值失败
(nil)
127.0.0.1:6379> get age #age失效
(nil)
127.0.0.1:6379> set age 30 NX PX 10000 #赋值成功
OK
127.0.0.1:6379> get age
"30"
list列表类型

list列表类型可以存储有序、可重复的元素
获取头部或尾部附近的记录是极快的
list的元素个数最多为2^32-1个(40亿)
常见操作命令如下表:

命令名称命令格式描述
lpushlpush key v1 v2 v3 …从左侧插入列表
lpoplpop key从列表左侧取出
rpushrpush key v1 v2 v3 …从右侧插入列表
rpoprpop key从列表右侧取出
lpushxlpushx key value将值插入到列表头部
rpushxrpushx key value将值插入到列表尾部
blpopblpop key timeout从列表左侧取出,当列表为空是阻塞,可以是设置最大阻塞时间,单位为秒
brpopbrpop key timeout从列表右侧取出,当列表为空是阻塞,可以设置最大阻塞时间,单位为秒
llenllen key获取列表中元素个数
lindexlindex key index获得列表中下标为index的元素 index从0开始
lrangelrange key start end返回列表中指定区间的元素,区间通过start和end指定
lremlrem key count value删除列表中与value相等的元素,当count>0时,lrem会从列表左边开始删除; 当count<0时,lrem会从列表后边开始删除; 当count=0时,lrem删除所有值为value的元素
lsetlset key index value将列表index位置的元素设置成value的值
ltrimltrim key start end对列表进行修剪,只保留start到end区间
rpoplpushrpoplpush key1 key2从key1列表右侧弹出并插入到key2列表左侧
brpoplpushbrpoplpush key1 key2从key1列表右侧弹出并插入到key2列表左侧,会阻塞
linsertlinsert key BEFORE/AFTER pivot value将value插入到列表,且位于值pivot之前或之后

应用场景:
1、作为栈或队列使用。列表有序可以作为栈和队列使用
2、可用于各种列表,比如用户列表、商品列表、评论列表等。

举例:

127.0.0.1:6379> lpush list:1 1 2 3 4 5 3
(integer) 5
127.0.0.1:6379> lrange list:1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> lpop list:1 # 从0开始
"5"
127.0.0.1:6379> rpop list:1
"1"
127.0.0.1:6379> lindex list:1 1
"3"
127.0.0.1:6379> lrange list:1 0 -1
1) "4"
2) "3"
3) "2"
127.0.0.1:6379> lindex list:1 1
"3"
127.0.0.1:6379> rpoplpush list:1 list:2
"2"
127.0.0.1:6379> lrange list:2 0 -1
1) "2"
127.0.0.1:6379> lrange list:1 0 -1
1) "4"
2) "3"
set集合类型

Set:无序、唯一元素
集合中最大的成员数为 2^32 - 1
常见操作命令如下表:

命令名称命令格式描述
saddsadd key mem1 mem2为集合添加新成员
sremsrem key mem1 mem2删除集合中指定成员
smemberssmembers key获取集合中所有元素
spopspop key返回集合中一个随机元素,并将该元素删除
srandmembersrandmember返回集中一个随机元素,不会删除该元素
scardscard key获得集合中元素的数量
sismembersismember key member判断元素是否在集合内
sintersinter key1 key2 key3求多集合的交集
sdiffsdiff key1 key2 key3求多集合的差集
sunionsunion key1 key2 key3求多集合的并集

应用场景:
适用于不能重复的且不需要顺序的数据结构
比如:关注的用户,还可以通过spop进行随机抽奖
举例:

127.0.0.1:6379> sadd set:1 a b c d
(integer) 4
127.0.0.1:6379> smembers set:1
1) "d"
2) "b"
3) "a"
4) "c"
127.0.0.1:6379> srandmember set:1
"c"
127.0.0.1:6379> srandmember set:1
"b"
127.0.0.1:6379> sadd set:2 b c r f
(integer) 4
127.0.0.1:6379> sinter set:1 set:2
1) "b"
2) "c"
127.0.0.1:6379> spop set:1
"d"
127.0.0.1:6379> smembers set:1
1) "b"
2) "a"
3) "c"
sortedset有序集合类型

SortedSet(ZSet) 有序集合: 元素本身是无序不重复的
每个元素关联一个分数(score)
常见操作命令如下表:

命令名称命令格式描述
zaddzadd key score1 member1 score2 member2 …为有序集合添加新成员
zremzrem key mem1 mem2删除有序集合中指定成员
zcardzcard key获得有序集合中的元素数量
zcountzcount key min max返回集合中score值在[min,max]区间的元素数量
zincrbyzincrby key increment member在集合member分值上加increment
zscorezscore key member获得集合中memeber的分值
zrankzrank key member获得集合中member的排名(按分值从小到大)
zrevrankzrevrank key member获得集合中member的排名(按分值从大到小)
zrangezrange key start end获得集合中指定区间成员,按分数递增排序
zrevrangezrevrange key start end获得集合中指定区间成员,按分数递减排序

应用场景:
由于可以按照分值排序,所以适用于各种排行榜。比如:点击排行榜、销量排行榜、关注排行榜等。

举例:

127.0.0.1:6379> zadd hit:1 100 item1 20 item2 45 item3
(integer) 3
127.0.0.1:6379> zcard hit:1
(integer) 3
127.0.0.1:6379> zscore hit:1 item3
"45"
127.0.0.1:6379> zrevrange hit:1 0 -1
1) "item1"
2) "item3"
3) "item2"
127.0.0.1:6379>
hash类型(散列表)

Redis hash 是一个 string 类型的 field 和 value 的映射表,它提供了字段和字段值的映射。

每个 hash 可以存储 2^32 - 1 键值对(40多亿)。

命令名称命令格式描述
hsethset key field value赋值,不区别新增或修改
hmsethmset key field1 value1 field2 value2批量赋值
hsetnxhsetnx key field value赋值,如果field存在则不操作
hexistshexists key field查看某个field是否存在
hgethget key field获取一个字段值
hmgethmget key field1 field2 …获取多个字段值
hgetallhgetall key
hdelhdel key field1 field2 …指定字段自增increment
hincrbyhincrby key field increment指定字段自增
hlenhlen key获得字段数量

应用场景:
对象的存储 ,表数据的映射

举例:

127.0.0.1:6379> hmset user:001 username zhangfei password 111 age 23 sex M
OK
127.0.0.1:6379> hgetall user:001
1) "username"
2) "zhangfei"
3) "password"
4) "111"
5) "age"
6) "23"
7) "sex"
8) "M"
127.0.0.1:6379> hget user:001 username
"zhangfei"
127.0.0.1:6379> hincrby user:001 age 1
(integer) 24
127.0.0.1:6379> hlen user:001
(integer) 4
bitmap位图类型

bitmap是进行位操作的
通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身。
bitmap本身会极大的节省储存空间。
常见操作命令如下表:

命令名称命令格式描述
setbitsetbit key offset value设置key在offset处的bit值(只能是0或者1)
getbitgetbit key offset获得key在offset处的bit值
bitcountbitcount key获得key的bit位为1的个数
bitposbitpos key value返回第一个被设置为bit值的索引值
bitopbitop and[or/xor/not] destkey key [key …]对多个key进行逻辑运算后存入destkey中

应用场景:
1、用户每月签到,用户id为key , 日期作为偏移量 1表示签到
2、统计活跃用户, 日期为key,用户id为偏移量 1表示活跃
3、查询用户在线状态, 日期为key,用户id为偏移量 1表示在线

举例:

127.0.0.1:6379> setbit user:sign:1000 20200101 1 #id为1000的用户20200101签到
(integer) 0
127.0.0.1:6379> setbit user:sign:1000 20200103 1 #id为1000的用户20200103签到
(integer) 0
127.0.0.1:6379> getbit user:sign:1000 20200101 #获得id为1000的用户20200101签到状态 1 表示签到
(integer) 1
127.0.0.1:6379> getbit user:sign:1000 20200102 #获得id为1000的用户20200102签到状态 0表示未签到
(integer) 0
127.0.0.1:6379> bitcount user:sign:1000 # 获得id为1000的用户签到次数
(integer) 2
127.0.0.1:6379> bitpos user:sign:1000 1 #id为1000的用户第一次签到的日期
(integer) 20200101
127.0.0.1:6379> setbit 20200201 1000 1 #20200201的1000号用户上线
(integer) 0
127.0.0.1:6379> setbit 20200202 1001 1 #20200202的1000号用户上线
(integer) 0
127.0.0.1:6379> setbit 20200201 1002 1 #20200201的1002号用户上线
(integer) 0
127.0.0.1:6379> bitcount 20200201 #20200201的上线用户有2个
(integer) 2
127.0.0.1:6379> bitop or desk1 20200201 20200202 #合并20200201的用户和20200202上线了的用户
(integer) 126
127.0.0.1:6379> bitcount desk1 #统计20200201和20200202都上线的用户个数
(integer) 3
stream数据流类型

stream是Redis5.0后新增的数据结构,用于可持久化的消息队列。
几乎满足了消息队列具备的全部内容,包括:

  • 消息ID的序列化生成
  • 消息遍历
  • 消息的阻塞和非阻塞读取
  • 消息的分组消费
  • 未完成消息的处理
  • 消息队列监控

每个Stream都有唯一的名称,它就是Redis的key,首次使用 xadd 指令追加消息时自动创建。

常见操作命令如下表:

命令名称命令格式描述
xaddxadd key id * field1 value1将指定消息数据追加到指定队列(key)中,* 表示最新生成的id(当前时间+序列号)
xreadxread [ COUNT count] [BLOCK milliseconds] STREAMS key [key …] ID [ID …]从消息队列中读取,COUNT:读取条数,BLOCK:阻塞读(默认不阻塞)key:队列名称 id:消息id
xrangexrange key start end [COUNT]读取队列中给定ID范围的消息 COUNT:返回消息条数(消息id从小到大)
xrevrangexrevrange key start end [COUNT]读取队列中给定ID范围的消息 COUNT:返回消息条数(消息id从大到小)
xdelxdel key id删除队列的消息
xgroupxgroup create key groupname id创建一个新的消费组
xgroupxgroup destory key groupname删除指定消费组
xgroupxgroup delconsumer key groupname cname删除指定消费组中的某个消费者
xgroupxgroup setid key id修改指定消息的最大id
xreadgroupxreadgroup group groupname consumer COUNT streams key从队列中的消费组中创建消费者并消费数据(consumer不存在则创建)

应用场景:
消息队列的使用

127.0.0.1:6379> xadd topic:001 * name zhangfei age 23
"1591151905088-0"
127.0.0.1:6379> xadd topic:001 * name zhaoyun age 24 name diaochan age 16
"1591151912113-0"
127.0.0.1:6379> xrange topic:001 - +
1) 1) "1591151905088-0"
2) 1) "name"
2) "zhangfei"
3) "age"
4) "23"
2) 1) "1591151912113-0"
2) 1) "name"
2) "zhaoyun"
3) "age"
4) "24"
5) "name"
6) "diaochan"
7) "age"
8) "16"
127.0.0.1:6379> xread COUNT 1 streams topic:001 0
1) 1) "topic:001"
2) 1) 1) "1591151905088-0"

2) 1) "name"
2) "zhangfei"
3) "age"
4) "23"
#创建的group1
127.0.0.1:6379> xgroup create topic:001 group1 0
OK
# 创建cus1加入到group1 消费 没有被消费过的消息 消费第一条
127.0.0.1:6379> xreadgroup group group1 cus1 count 1 streams topic:001 >
1) 1) "topic:001"
2) 1) 1) "1591151905088-0"
       2) 1) "name" 
           2) "zhangfei" 
           3) "age"  
           4) "23"
#继续消费 第二条
127.0.0.1:6379> xreadgroup group group1 cus1 count 1 streams topic:001 >
1) 1) "topic:001"
2) 1) 1) "1591151912113-0"
2) 1) "name"
2) "zhaoyun"
3) "age"
4) "24"
5) "name"
6) "diaochan"
7) "age"
8) "16"
#没有可消费
127.0.0.1:6379> xreadgroup group group1 cus1 count 1 streams topic:001 >
(nil)

Redis常用命令
官方命令大全网址:http://www.redis.cn/commands.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JermeryBesian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值