Redis高级功能整理笔记

1、Redis支持的数据类型

String类型:字符串类型是二进制文件,可以将图片和视频存入到string中,string类型支持incr操作,可以用做统计计算

List类型:列表是指key对应的value是一个双向链表结构,可以实现消息队列功能,减轻数据库压力

Set类型:是一种无序集合,在redis内部通过hashtable实现,查找和删除元素的复杂度为0(1),优点:快速查找元素是否存在,用于记录一些不能重复的数据

Sort Set类型:是一种有序集合,通过一个double类型的整数score进行排序,内部通过跳跃表和hashtable组合完成,可以实现一个优先级的队列,比如排行榜

Hash类型:哈希类型是每个key对应一个hashtable,添加、删除和修改操作的时间复杂度0(1),hash类型适合存储对象

2、Redis排序命令

sort key:不设置任何选项是对集合元素进行简单排序,默认正序

sort key [ASC | DESC | ALPHA]:默认排序ASC(从小到大),DESC(从大到小),ALPHA(字母顺序)

sort key [by pattern]:按照给你模式(parttern)将集合元素内容自合成新key,并按新key对应的内容排序,完成后返回排好序的集合元素。

    举例:

        lpush list 1 从list集合头部添加一个值为1的数据

        lpush list 2 从list集合头部再添加一个值为2的数据

        set name1 102 设置一个name1的key,值为102

        set name2 101 设置一个name2的key,值为101

        sort list by name*:name*表示将list里的元素填充到*,按照name*里面的值进行排序,返回的是排序后的list集合中的元素

sort key [limit start count]:limit选项能够限定返回结果的数据。下标从start开始,获取count个元素

sort key [store dstkey]:按照固定模式排序后,将排序后的集合缓存在dstkey中,可以减少cpu的开销 

3、事务处理

原理:redis接收到一个客户端连接发出的multi命令,此连接会进入一个事务上下文,redis把此连接发来的命令存入一个队列中。当此连接发出exec命令,redis便开始按顺序执行队列中的所有命令,并将所有命令执行结果打包一起返回给客户端连接,结束事务上下文。

保证一个client发起事务中的命令可以连续执行,而中间不会插入其他client命令,multi:打开一个务  exec:按顺序执行  discard:取消一个事务。

缺点:某个命令不成功,事务中其他命令正常执行,事务不会回滚。

watch命令监视给定的key,相当于给key加一个乐观锁。

4、两种持久化机制:

快照(snapshotting):redis数据是保存在内存中,默认是以快照(RDB)的方式将数据持久化到磁盘上。以下是配置文件中的默认配置

save 900 1:表示900秒内如果至少有一个key的值变化,则保存快照

save 300 10:表示300秒内如果至少10个key的值变化,则保存快照

save 60 1000:表示60秒内如果至少有1000个key的值变化,则保存快照

工作原理:redis会fork一个子进程,子进程会将数据写到磁盘上的一个临时rdb文件中。当子进程完成写临时文件,将原来的rdb替换掉。这样的好处是可以copy-on-write。

缺点:如果遇到redis不正常关机,会导致最近的数据会丢失

Append-only file(AOF): 将redis的配置文件中的appendonly yes开启就可以使用aof方式持久化。redis每执行一个修改数据的命令,都会添加到aof文件中,当redis重启后,会读取aof文件进行恢复到redis关闭前的最后时刻。

aof三种刷新方式:appendfsync alaways(每次更新操作后手动调用fsync将数据写到磁盘中)、appendfsync eveysec(表示每秒同步一次,推荐)、appendfsync no(等操作系统进行缓存同步到磁盘中)

工作原理:redis会fork一个子进程,子进程将最新的aof写入到一个临时文件,父进程增量的把内存中最新的执行命令写入到就得aof文件,当子进程完成重写临时文件后,父进程收到一个信号,把之前内存中增量的修改写入到临时文件的末尾,然后将aof文件重命名,临时文件重命名,开始向新的aof中写入。

缺点:由于都会存在aof文件中,会导致aof文件越来越大,虽然数据不会丢失redis性能会差些。但是可以通过bgrewriteaof命令将当前内存中最短序列的命令写到磁盘中来缩小aof文件的大小。

5、主从同步

特点:一台主服务器可以有对个从服务器。多个从服务器可以连接同一个主服务器外,还可以连接其他从服务器。主从复制不会阻塞主服务器,再同步数据时,只服务器继续可以处理client请求。

过程:

第一阶段

1)slave服务器主动连接到master服务器

2)slave服务器发送sycn命令到master服务器请求同步

3)master服务器备份数据库到rdb文件中(备份期间,会将接收到的命令缓存起来)

4)master服务器把rdb文件传输给slave服务器

5)slave服务器清空数据库数据,把rdb文件导入到数据库中

第二阶段

6)接下来master服务器把用户所有更改数据的操作,通过命令的形式转发给所有slave服务器

7)salve服务器执行master服务器发送过来的命令,就可以实现同步

6、消息订阅

实现原理:当客户端执行subscribe命令订阅频道时,服务器会将客户端与被订阅频道在pubsub_channels字典中进行关联,如果频道已经有其他的订阅者,那么字典必有相应的订阅者链表。

7、虚拟内存(VM)

redis把数据库中的数据存放在内存中,随着数据的不断增加,会导致内存不足的情况,从而可以使用VM功能,将很少访问的value保存到磁盘中。VM系统只能把value对应的object交换在磁盘中,而把所有key的object放在内存中,保证了查询性能

交换过程:

1)计算保存这个对象需要占用的swap文件中的多少页

2)在swap文件中寻找一段连续页空间来保存这个对象

3)把对象写入swap文件

阻塞式VM与非阻塞式VM:将配置文件中vm-max-threads设置为0为阻塞式VM,大于0则采用的I/O线程进行交换,只有内存占用超过vm-max-memory设定值时,才会触发VM交换。阻塞式VM优点是简单,当客户端访问被换出的数据或者redis正在将数据换出时,redis将不能处理其他客户端请求,从而阻塞其他客户端

8、内存淘汰

当数据库内存不足时,redis可以采用启用虚拟内存(vm-enabled设置为yes)或者启用内存淘汰(将maxmemory设置大于0的整数)

redis淘汰算法:

1)随机淘汰算法:从数据库中随机删除一个key

2)LRU淘汰算法:从数据库中删除一个最近最少使用的key(memcached只有此方式)

3)TTL淘汰算法:从数据中删除一个最快过期的key

9、对象引用计数

原理:给对象添加一个引用计数器,每当有地方引用它时,计数值就加1,当引用失效时,计数器值就减1,当计数器为0时,将对象从内存中删除

10、自动关闭超时连接

当有一个客户端连接在一定时间内不进行任何操作时,redis自动关闭它,因为redis只能处理有限的客户端连接,这个功能有效的防止一些用户恶意占用连接。开启:timeout设置为大于0的整数

11、清除过期数据

redis为每个存储的数据设定一个过期时间,当到达这个设定的过期时间后,redis便会把过期的数据从内存中删除

redis清除过期数据的两个阶段:

1)在定时器中进行:随机删除一些过期数据

2)用户获取数据是进行

转载于:https://my.oschina.net/u/863367/blog/790546

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值