第十四章《redis》

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 第十四章《redis》

redis(Remote dictionary server):是一个基于键值对(key-value)的NoSQL是一个开源软件
redis的数据是存储在内存当中,可用于好俗缓存,消息队列。redis主要的数据类型有5种;
字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(zset);

redis的优点
1.速度快 读的速度大约110000/s,写的速度大约85000/s;
2.数据类型多样,可以实现的功能多
3.简单稳定,代码量少,单线程进行工作
4.支持的语言多,perl,python,java,lua等等;
5.持久化
6.主从复制
7.高可用和分布式

缺点:由于数据存储在内存当中,大规模的数据存放在redis中,内存成本太高

set key value [EX seconds] [PX milliseconds] [NX|XX]
EX:设置键值对是添加键过期,单位是秒
PX:设置键值对是添加键过期,单位是微秒

NX:表示这个键是新的,是之前不存在的(用于创建键值对)
XX:表示这个键是存在的(用于修改键值对的值)

redis全局命令:
keys * 查询所有的键
dbsize 统计键的数量总和
exists key 查看这个key是否存在
del key 删除键值对

redis的数据结构类型:
1.字符串
2.hash
3.列表(list)
4.集合(set)
5.有序集合(zset)

键过期:已经存在的键值对设置过期时间:expire key 数字 (单位是秒),当超过过期时间,这个键自动删除;
ttl key:查看这个键的过期时间,如果返回的数字大于0表示还有数字秒过期,返回数字为1表示没有给这个键设置过期时间,返回2,表示这个键不存在或已过期

5种数据结构类型;
在redis中,所有的key都是字符串类型的数据
1.字符串(string):指的是值的数据类型是字符串,包含简单的字符串和复杂的字符串,以及数字、图片、声音、视频等这些二进制; 特点:一个key对应一个value。
单个值大小不超过512M;
命令格式:
1.设置字符串:set key value [ex seconds] [px milliseconds] [nx|xx]
2.获取值: get key
3.查询键是否存在:exists key
4.批量设置键值对:mset key value key value...
5.批量获取值:mget key1 key2...
6.计数:
(1)incr key :对整数数字有效,给key的值增加1,如果这个键不存在,这个命令会设置这个键并且默认值是从0开始增加1;
(2)decr key :自减1,其余和上面保持一致;
(3)incrby key 数字:给key加上数字;
(4)decrby key 数字:给key减去数字;
(5)incrbyfloat 小数 :给key加上小数

7.append key value:给key的值垢面再加上一个字符串;
8.strlen key:显示key对应的value字符串长度
9.getset key newvalue:更新key的值并返回原值;
10.setrange key offset str:更新value某一个位置上的字符串;(如果我们要设置的offset已经超出value的长度,它仍然会把新的字符串添加到下标指定的位置。从value最后一位到指定下标位置全部用“\x00”来填充);
11.getrange key start end:获取部分value;

字符串的内部编码:redis 根据key对应的value的长短、类型来判断使用哪种内部编码
int: 8字节长度的整数;
embstr: 小于等于39个字节的字符串;
raw: 大于39个字节的字符串

object encoding key:查看key对应value的内部编码

哈希(hash): key-value=(filed1,value1 filed2,value2....) key对应的不是一个value,而是一组或几组(filed,value)

hash命令格式
设置键值:hset key field value 成功返回1,不成功返回0

获取filed值:
hget key field

删除filed值
hdel key filed1 filed2 .。。

统计field的个数
hlen key

批量设置和获取filed value
hmset key filed1 value1 filed2 value2.。。

获取所有filed
hkeys key

获取所有filed的值
hvals key

获取所有的filed和value:
hgetall key

filed的value如果是整数
hincrby key filed count 给filed添加一个数字,如果filed不存在,会创建filed
hincrbyfloat key filed float 给filed添加一个小数;

计算value的字符串长度
hstrlen key filed

hash内部编码:
ziplist:当hash类型元素(filed和value的和)个数不小于512个,单个value的长度小于64字节;
hashtable(哈希表):不满足ziplist的条件
object encoding key 查看内部编码;
列表list:key-(一组有序排列的元素)a b c d e这一组元素他是有序排列的,所以可以通过下标来获取对应的元素,元素最多不超过2^32-1个;

列表类型 的2个特点:1.元素的有序性 2.元素可重复

列表的命令:
添加元素:
lpush key value1 value2 ... 从列表的左边添加元素;
rpush key value1 value2 ...从列表的右边添加元素
linsert key before | after pivot value 在原有的某个元素前边/后边添加一个新的元素

查看列表里的元素:
lrange key start end

lindex key index 获取下标为index的元素
获取列表元素的个数:
llen key
删除列表元素:
lpop key 从列表左边删除一个元素
rpop key 从列表右边删除一个元素
lrem key count value 删除指定元素,count>0表示从列表的左端开始删除,count表示删除这个元素的个数;count<0表示从列表右端开始删除,count的相反数表示删除这个元素的个数,count=0表示删除列表内所有的这个元素,如果想要删除的元素不存在,则不删除。

修改:
lset key index newvalue 修改列表index对应的值

阻塞操作:
blpop key timeout 从左边删除,如果key里的元素被删光了就会阻塞timeout秒
brpop key timeout 从右边删除,如果key里的元素被删光了就会阻塞timeout秒

列表的内部编码:
ziplist:元素个数不超过512,每个元素的长度不超过64字节
linkedist(链表):不满足ziplist条件就会用linkedist

集合(set):集合也是用来保存多个字符串元素的,他的元素不能重复,他的元素是无序的,不能通过下标查看元素,元素不超过512个,每个元素的长度不能超过64字节;
能够进行集合间的运算:交集、差集、并集
{0,1,2,3,4} {1,4,5,7,8}
交集:{1,4}
差集:{0,2,3,5,7,8}
并集:{0,1,2,3,4,5,7,8}

命令:
1、添加元素:
sadd key member1 member2...
2.删除元素
srem key member1 member2...
3.统计元素
scard key
4.随机从集合中返回指定个数的元素:
srandmember key [count] count 不写默认返回1个
5.随机删除集合中指定个数的元素:
spop key [count]
6.查看集合内所有元素
smembers key

集合间的操作:
交集:sinter key1 key2...
差集:sdiff key1 key2...
并集:sunion key1 key2...

差集:key1的元素-key1和key2共同有的元素

myset3 [a b c d e f]
myset4 [a b c d i h k]
myset3-myset4 [e f]
myset4-myset3 [i h k]

集合的内部编码
intest(整数集合):当集合中的元素都是整数且元素个数少于512,redis会使用intest来保存数据
hashtable:

有序集合(zset):和集合一样元素不重复,不同的是它通过给元素加上一个分数(score)来进行排序

命令:
1.添加成员:
zadd key score member...

2.统计有序集合元素个数
zcard key

3.获取某个成员的分数
zscore key member

4.获取成员排名
zrank key member 分数由低到高来排 返回数字就是排名(从0开始)
zrevrank key member 分数由高到低来排
5.删除成员
zrem key member1 member2.。。

6.增加元素的分数
zincrby key incr-score(增加的分数) member

7.查询指定排名范围的成员:
zrange key start end [withscores] 由低到高
zrevrange key start end [withscores] 由高到低

8.查询指定分数范围的成员:
zrangebyscore key minscore maxscore [withscores] [limit offset count] 由低到高
zrevrangebyscore key minscore maxscore [withscores] [limit offset count] 由高到低

-inf:无限小
+inf:无限大

9.查询指定分数范围的成员个数
zcount key min max

10.删除指定排名范围的成员:
zremrangebyrank key start ent

11.删除指定分数范围的成员
zremrangebyscore key min max

集合间的操作:
交集:zinterstore destination key1 key2 [weights num1 num2] [aggregate sum|min|max]

numkeys:交集计算的有序集合的个数
weights:权重

并集:zunionstore destination numkeys key1 key2 [weight num1 num2] [aggregate sum|min|max]

内部编码:
ziplist:元素个数2^32-1,单个元素长度不超过64M
skiplist(跳跃表):

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
另开终端
在这里插入图片描述
在这里插入图片描述
多开redis
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
缓存 NoSQL 应用服务中间件
Redis实战篇
Redis实战篇
|
5月前
|
存储 NoSQL Java
10个很多人不知道的Redis使用技巧
10个很多人不知道的Redis使用技巧
|
存储 移动开发 NoSQL
Redis - 原理篇-2
Redis - 原理篇-2
98 0
Redis - 原理篇-2
|
6月前
|
存储 NoSQL Linux
Redis入门到通关之Redis5种网络模型详解
Redis入门到通关之Redis5种网络模型详解
104 1
|
6月前
|
存储 缓存 NoSQL
Redis 常见问题解决方案
Redis 常见问题解决方案
43 0
|
存储 NoSQL 关系型数据库
【Redis从头学-0】一张思维导图对Redis做出基本介绍
【Redis从头学-0】一张思维导图对Redis做出基本介绍
102 0
|
6月前
|
存储 NoSQL 网络协议
Redis Cluster 原理说的头头是道,这些配置不懂就是纸上谈兵
Redis Cluster 原理说的头头是道,这些配置不懂就是纸上谈兵
67 0
|
存储 NoSQL Linux
Redis - 原理篇-1
Redis - 原理篇-1
55 0
|
存储 NoSQL Redis
Redis(二十九)- Redis集群的介绍以及搭建
上一篇文章我们介绍了哨兵模式,Redis(二十八)- Redis的哨兵模式。哨兵模式虽然解决主机master宕机之后,从机slave自动上位的问题。但是,该模式中主机还是只能有一个,还是存在性能瓶颈。下面介绍的Redis集群则可以解决这个问题。
205 0
Redis(二十九)- Redis集群的介绍以及搭建
|
缓存 NoSQL Java
Redis(三十二)-用Redis做分布式锁
随着业务发展的需要,原有的单机部署的系统逐渐演变成了分布式集群系统,由于分布式系统多线程,多进程分布在不同的机器上,这使得原有的并发控制策略失效,单纯的Java API并不能提供分布式锁的能力(就是Java中的本地锁Lock以及synchronized)。 为了解决这个问题就需要一种能跨JVM的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题。
155 0
Redis(三十二)-用Redis做分布式锁
下一篇
无影云桌面