redis
2020-01-16 09:19:17 52 举报
AI智能生成
redis
作者其他创作
大纲/内容
事物
事物是一个单独的隔离操作:
事物中所有的命令都会序列化
按顺序的执行,事物在执行过程中
不会被其他客户端发送过来的命令请求所
打断。主要作用是串联多个命令防止别的命令
插队
事物中所有的命令都会序列化
按顺序的执行,事物在执行过程中
不会被其他客户端发送过来的命令请求所
打断。主要作用是串联多个命令防止别的命令
插队
Multi,exec,discard:从输入Multi命令开始,
输入的命令都会依次进入命令队列中,但不会执行
至输入到Exec后,Redis会将之前的命令队列中的命令依次执行
可以通过discard来放弃组队
输入的命令都会依次进入命令队列中,但不会执行
至输入到Exec后,Redis会将之前的命令队列中的命令依次执行
可以通过discard来放弃组队
如果在执行阶段某个错误,只有报错的命令不会被执行
而其他的命令都会被执行,不会进行回滚。而在组队阶段中
出现了报告多问的话,整个队列都会被取消
而其他的命令都会被执行,不会进行回滚。而在组队阶段中
出现了报告多问的话,整个队列都会被取消
持久化
RDB(redis DataBase)
在指定的时间内将内存的数据
筷子写入磁盘,也就是snapshot快照
它恢复是将快照文件直接读到内存里
筷子写入磁盘,也就是snapshot快照
它恢复是将快照文件直接读到内存里
AOF(Append of File)
redis的基础结构
其实,redis的每一个字符串都是使用SDS
(simgple dynamic string)来进行表示的。
它是c语言的一个结构(对象)。里面有三种属性
len:代表字符串长度
free:代表数组中未使用的字节的数量
char buf[]表示未使用的数组
SDS和字符串的区别
1.可以更快的获取到字符串的长度(因为长度已经记录在SDS
的对象当中了)
2.杜绝了冲区的溢出:因为C字符串没有单独
纪律字符串的长度,导致如将两个字符串拼接到一起
然后更改其中一个字符串的长度的是,位置将会发生错乱
。而如果是SDS的话,则会先进行长度的判断,自动扩展
空间长度。
3.SDS还可以保持而二进制或者文本文件
4.可以使用部分的<String.h>中的函数
链表
在列表List建中使用的就是列表
列表在底层也是c语言来进行书写的:这个是ListNode的数据
结构*prev 前面的节点 *next 后面的节点 *value的节点。
每个节点应该都是SDS
list的数据结构:*head表头节点
*tail表尾节点,len包含节点数量
*(*dup)(*ptr)节点复杂函数等等
有几种特点:
1.双端:链表中都有前一个和
后一个的指针。获取前一个和后一个
复杂度都是哦(1)
2.无环:表头的prev和表尾的next都是指向null
3.由于在list的数据结构中有表头和表尾
所以获取表头和表尾的复杂度尾o(1)
4.带长度的计数器:节点的长度也是o(1)
5.多态:链表可以用来保存各种不同类型的值
字典
是一种用于保存建值对的抽象数据结构
hash的一个数据结构:
**table 哈希表数组,long Size表长度
long sizemask hash表大小掩码,long
user 已经使用的节点长度
DictEntry是哈希表中的节点的:
结构为 *key和*val *next下一个节点的指针。next是用来
指向hash相同的键值的节点的。这样解决了
hash冲突的问题。
字典中的数据结构为:* type:类型特定的函数
*privdata 私有数据,ht[2]为hash表,就是上面的数据类型
trehashidx 当rehash不再进行时为-1
tyoe是指向一个dicttype结构的指针。每一个
dictType结构都保存了一簇用于操作特定类型键值
的函数
Privdata属性这保存了需要传该那些类型特定函数的
可选参数
当一个新的键值添加到字典时,程序需要先
根据键和值计算出哈希值和索引值。然后在根据
索引添加
跳跃表
跳跃表是一个有序的数据结构,它通过每个节点
中维持多个指向其他接待你的指针达到快速访问
节点的作用(在redis使用跳跃表作为有序集合键
的底层实现之一)
跳跃表在reids中只用到了两个地方
一个是实现有序集合,一个是集群节点
中用作内部的数据结构。
跳跃表的基本结构
Header:指向了跳跃表表头的节点
tail:指向了跳跃表的表结尾
level:记录了跳跃表内层数最大的那个节点
length:跳跃表的长度,也是跳跃表目前包含的节点数
zskipListNode:跳跃表的节点结构
level:节点中用L1等字样表示各个层
每个层代表着两个属性:前进指针和跨度
前进的指针用于防伪位于表尾方向的其他及节点
而跨度表示了前进指针所指向的节点和当前节点的
距离。
后退指针:节点中用BW字样标记节点的
后退字段。它指向当前节点的前一个节点。
分值:各个节点中的1.0 2.0是节点所保存的分子。
在跳跃表中,各个节点保存的分子从小到大排列
成员对象(obj):各个节点保存的成员对象
其实使用多个跳跃节点也能构成一个跳跃表
但是有了zskipList可以更方便的对整个跳跃表
进行处理。比如更快的进行访问跳跃表头节点和
表尾节点等等操作
整数集合
整数集合是集合键(set)的底层实现之一,当一个
集合只包含整数元素,并且数量不多的情况下,redies就是
是哟个整数集合来作为集合键的底层实现
整数集合的底层机构
encoding:编码方式
length:集合长度
Contens[]:整数集合的每一个元素都是contents数组
中的一个item,从小到大排序,并且不包含重复项
升级
定义:当将一个新元素添加到整数集合中的时候
新元素的类型比整数集合现有的类型都要长是
整数集合需要进行升级
1.根据新加的元素类型,扩展整数集合数组
的空间大小,并为新元素分配空间
2,将底层数组现有的所有元素都转化为新元素相同的类型
,位置保持不变。
3.将新元素添加到底层数组里面
好处有两个:提升灵活性,一个劲可能的节约内存
压缩列表
压缩列表是List和Hash的底层实现之一
使用场景
最新N个数据:通过List实现按自然时间排序的数据
排行榜:利用zset(有序不重复的集合)
时效性数据(手机验证码):Expire过期性
计时器(秒杀):利用原子性的自增方法
去重大量数据中的重复数据:利用set的集合
构建队列:利用List集合
发布订阅消息系统:pub/sub的模式
基本命令
ping:测试是否连接成功
shutdown:关闭服务端
keys *:查看所有的键
exists a:是否存在a键
expire <key> <second>:设置键的过期时间,这个key必须已经存在
ttl <key>:查看key是否过期(-1表示永不过期,-2表示已经过期)
dbsize:查看当前数据的key的数量
Flushdb:清空当前库
select <dbname>:选择redis数据库
Flushall:清除所有库
使用注意
将redis设置为后台启动:deamonize no改成yes让服务器在后台启动
启动的时候可以再命令后面加上自己的配置文件:
redis-server /myredis/redis.conf
redis-server /myredis/redis.conf
使用客户端连接指定ip上面的redis:redis-cli -h 127.0.0.1 -p 6379
默认16个数据库,类似数组从0开始。切换数据库:select <dbid>
Redis是单线程+多路IO复用模型:多路复用模型就是利用select
poll,epoll可以同时坚持多个流的IO事件的能力。当有一个或者多个
流有IO事件的时候,就从阻塞状态中唤醒,于是程序就会轮询一遍所有的
流(epoll只会轮询那些真正发生了事件的流)并且依次顺序的处理就绪的流。
避免了大量的操作
poll,epoll可以同时坚持多个流的IO事件的能力。当有一个或者多个
流有IO事件的时候,就从阻塞状态中唤醒,于是程序就会轮询一遍所有的
流(epoll只会轮询那些真正发生了事件的流)并且依次顺序的处理就绪的流。
避免了大量的操作
select:无差别建设,如果发生了IO操作,会循环访问所有的流
最大连接32为上1024个 64位上为2048
最大连接32为上1024个 64位上为2048
poll:和select无本质区别,将用户传入的数组拷贝到内核空间中,没有最大连接数
epoll:event poll,epoll会把哪个流上面发生了IO时间通知我们,实际上是
事件驱动的
事件驱动的
五种数据类型(key)
string
String类型是二进制安全的,可以包含jpg图片
或者序列化的对象
或者序列化的对象
字符串的Value最多可以是512M
get<key>:查询对应的键值
set<key><Value>;添加键值
append<key><value>:给指定的Value追加
到原值的末尾
到原值的末尾
strlen<key> 获得值得长度
sentx<key><value> 只有在key不存在的时候 设置key的值
incr<key>:对存储中的数字增1(只能对数字进行操作,如果为空新增为1)
都是为原子性操作
都是为原子性操作
decr<key>:与上面对应,减1新增为-1
incrby/decrby<key> <步长> 增减步长
mset <key><value><key1><value1> 设置多个键值对
set
与list类似,但是set可以排重复,是一个无序集合
底层是一个value为null的hash表
底层是一个value为null的hash表
sadd <key><value1><value2> 将元素加入到集合key中,重复的则
会被忽略
会被忽略
smembers<key> 取出该集合中所有的值
sismember<key><value>判断集合中释放有<value>的值,有
返回1 没有返回0
返回1 没有返回0
scard <key> 返回该集合的元素的个数
srem:删除集合中的某个元素
spop 随机从集合中弹出一个值
srandmember<key><n> 随机从集合中取出n个值
不会从集合中删除
不会从集合中删除
sinter<key1><key2> 返回两个集合的交集元素
sunion <key1><key2>返回两个集合的并集元素
sdiff<key1><key2> 返回两个集合的差集元素
list
代表单键多值:是一个简单的字符串列表
lpush/rpush <key> <value1><value2>从左边或者右边插入一个或者多个值
lpop/rpop <key> 从左边或者右边 弹出数据
rpoplpush <key1> <key2> 从key1的右边弹出一个值
添加到key2的左边
添加到key2的左边
llen <key> 获得列表长度
hash
hash就是一个键值对类似map,适合存储对象
hset <key> <field><value>
hmset <key> <field1><value1>:在key中添加多个键值对
hget <key1><field> 从<key1>集合<field>取出valeu
hexists key <field> 查看hash表中是否存在field
hkeys<key> 列出该hash集合所有的field
hvals<key> 列出hash集合所有的value
hgetall key 获取所有的数据
zset(有序不重复)
是一个没有重复元素的字符串集合,不同之处
来着每个成员都关联了一个评分。成员唯一,但评分可以重复
.因为元素有序,所以可以通过score和position来获取一个范围内
的元素
来着每个成员都关联了一个评分。成员唯一,但评分可以重复
.因为元素有序,所以可以通过score和position来获取一个范围内
的元素
zadd key score1 value1 score2 value2
zrange key start stop [WITHSCORES]:获取zset中的值
后面可以将scores一起显示出来
后面可以将scores一起显示出来
zrangebyscore key min max [withscores] [limit offset count] 在区间之内
(从小到大排序)
(从小到大排序)
0 条评论
下一页