当前位置:网站首页 > 数据科学与大数据 > 正文

NoSQL数据库(三)03-Redis进阶与实战——EXPIRE实现服务器缓存数据 & sort实现排序之对列表类型、有序集合和非数字类型进行排序 & Redis的底层通信协议对管道提供支持

NoSQL数据库(三)03-Redis进阶与实战——EXPIRE实现服务器缓存数据 & sort实现排序之对列表类型、有序集合和非数字类型进行排序 & Redis的底层通信协议对管道提供支持

ex:实现缓存

假设学生成绩总在不断地变化,需要每隔两个小时就重新计算一次排名,这可以通过给键设置过期时间的方式实现。每次用户访问首页时程序先查询缓存键是否存在,如果存在则直接使用缓存的值;否则重新计算排名并将计算结果赋值给该键并同时设置该键的过期时间为两个小时。伪代码如下:

var redis = require('redis'); var client = new redis({ 
    // 配置 }); var rank = client.get('cache:rank'); if(!rank) { 
    var $rank = jisuan(); client.multi(); client.set(`cache:rank ${ 
     $rank}`); client.expire(`cache:rank 7200`); client.exec(); } 

然而在一些场合中这种方法并不能满足需要。当服务器内存有限时,如果大量地使用缓存键且过期时间设置得过长就会导致 Redis 占满内存;另一方面如果为了防止 Redis 占用内存过大而将缓存键的过期时间设得太短,就可能导致缓存命中率过低并且大量内存白白地闲置。实际开发中会发现很难为缓存键设置合理的过期时间,为此可以限制 Redis 能够使用的最大内存,并让Redis按照一定的规则淘汰不需要的缓存键,这种方式在只将Redis用作缓存系统时非常实用。

实例

cache.js

var redis = require('redis'); var client = new redis({ 
    // 配置 }); // 定于一个key cache:rank // 1. 获取成绩 2. 如果没有 重新计算缓存 , 如果有,直接读取,不需要计算 var rank = client.get('cache:rank'); if (rank) { 
    // 有, 直接返回 } else { 
    var $rank = jisuan(); client.multi(); client.set(`cache:rank ${ 
     $rank}`); client.expire('cache:rank 7200'); client.exec(); } 
排序

我们学过哪些可以排序的操作?

  • 有序集合: 根据存储的分数进行排序
  • 列表: 根据插入的顺序排序

介绍一种新的排序方法 SORT

  1. sort可以对列表类型进行排序
redis> LPUSH mylist 4 2 6 1 3 7 (integer) 6 redis> SORT mylist 
  1. sort可以对有序集合进行排序
redis> ZADD myzset 50 2 40 3 20 1 60 5 (integer) 4 redis> SORT myzset 1) "1" 2) "2" 3) "3" 4) "5" 

在对有序集合类型排序时会忽略元素的分数,只针对元素自身的值进行排序。

  1. 还可以对非数字类型进行排序
redis> LPUSH mylistalpha a c e d B C A (integer) 7 redis> SORT mylistalpha (error) ERR One or more scores can't be converted into double redis> SORT mylistalpha ALPHA 1) "A" 2) "B" 3) "C" 4) "a" 5) "c" 6) "d" 7) "e" 
  1. DESC参数可以从大到小排序,还可以加入limit参数
  2. 通过BY来根据时间排序

BY参数的语法为BY参考键。其中参考键可以是字符串类型键或者是散列类型键的某个字段(表示为键名->字段名)。如果提供了 BY 参数,SORT 命令将不再依据元素自身的值进行排序,而是对每个元素使用元素的值替换参考键中的第一个“*”并获取其值,然后依据该值对元素排序。就像这样:

redis> SORT tag:ruby:posts BY post:*->time DESC 1) "12" 2) "26" 3) "6" 4) "2" 

在上例中SORT命令会读取post:2、post:6、post:12、post:26几个散列键中的time字段的值并以此决定tag:ruby:posts键中各个文章ID的顺序。

还可以跟进GET参数获取你想要的字段的值,而不是排序的依据字段

SORT tag:ruby:posts BY post:*->time DESC GET post:*->title

SORT tag:ruby:posts BY post:*->time DESC GET post:*->title GET post:*->time

如果还想返回文章的ID怎么办

redis> SORT tag:ruby:posts BY post:*->time DESC GET post:*->title GET post:*->time GET #

性能

比如SORT是redis最复杂的命令之一,如果使用的不好容易造成性能瓶颈。

SORT命令的复杂度为 0(n + mlog(m)), n代表要排序的列表长度,m代表需要返回的元素个数。

  1. 尽可能减少待排序键中元素的属性(使n尽可能小)
  2. 利用LIMIT参数使m尽可能的小
  3. 如果要排序的数量比较大,尽量将结果缓存
管道

客户端和Redis使用TCP协议连接。不论是客户端向Redis发送命令还是Redis向客户端返回命令的执行结果,都需要经过网络传输,这两个部分的总耗时称为往返时延。

Redis 的底层通信协议对管道(pipelining)提供了支持。通过管道可以一次性发送多条命令并在执行完后一次性将结果返回,当一组命令中每条命令都不依赖于之前命令的执行结果时就可以将这组命令一起通过管道发出。

在这里插入图片描述

在这里插入图片描述

节省空间
精简键值和键名

精简键名和键值是最直观的减少内存占用的方式,如将键名very.important.person:20改成VIP:20。当然精简键名一定要把握好尺度,不能单纯为了节约空间而使用不易理解的键名(比如将VIP:20修改为V:20,这样既不易维护,还容易造成命名冲突)。又比如一个存储用户性别的字符串类型键的取值是male和female,我们可以将其修改成m和f来为每条记录节约几个字节的空间,甚至通过二进制的0和1来表示。

到此这篇NoSQL数据库(三)03-Redis进阶与实战——EXPIRE实现服务器缓存数据 & sort实现排序之对列表类型、有序集合和非数字类型进行排序 & Redis的底层通信协议对管道提供支持的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • NoSQL数据库(三)04-Redis进阶与实战——nodejs操作redis数据库之ioredis更新属于node_redis改良版 & ioredis的可视化工具安装、基本语法、管道与事务2024-12-01 13:36:08
  • NoSQL数据库(三)05-Redis进阶与实战——总结之事务-错误处理和watch、过期时间、sort排序、by排序 & noedjs操作redis数据库2024-12-01 13:36:08
  • NoSQL数据库(四)-memcached——介绍-分布式内存对象缓存系统、安装、api之set设置、add新增、replace替换、append追加2024-12-01 13:36:08
  • NoSQL数据库(五)01-mongoDB入门——介绍与应用场景、安装与可视化工具 & 使用node-mongodb-native进行增删改查2024-12-01 13:36:08
  • NoSQL数据库(五)022-Egg+Redis+MongoDb实现登录流程——业务流程梳理 & 安装依赖与页面编写2024-12-01 13:36:08
  • NoSQL数据库(三)02-Redis进阶与实战——EXPIRE命令设置过期时间-实现定期检测删除过期数据 & EXPIRE实现和优化访问服务器频率限制2024-12-01 13:36:08
  • NoSQL数据库(三)01-Redis进阶与实战——redis事务命令与错误处理、事务中的watch命令2024-12-01 13:36:08
  • NoSQL数据库(二)06——redis总结之发展、特点、安装、操作 & 数据类型之字符串数据类型、散列、列表、集合、有序集合2024-12-01 13:36:08
  • NoSQL数据库(二)04-Redis数据类型——集合类型之介绍、命令-增加和删除元素、获得集合中的所有元素、判断元素是否在集合中、集合间运算2024-12-01 13:36:08
  • NoSQL数据库(二)03-Redis数据类型——列表类型之介绍、命令-向列表两端增加元素、从列表两端弹出元素、获取列表中元素的个数、删除列表中指定的值2024-12-01 13:36:08
  • 全屏图片