和redis_Redis 缓存

使用场景#

  • Redis 通常用作web应用的内存缓存,和Django,Ruby-on-Rails,Node.js以及Flask框架结合
  • Redis在存储新的数据的过程中可以清除陈旧的数据。
  • Redis使用Less Recently Used(LRU)策略,可以为每个健设置过期时间
  • Redis 存储指标数据用于量化网站的使用情况和用户行为数据
  • Redis可用作不同系统之间的通讯层,通过订阅推送消息模型

数据模型#

  • 字符串 简单动态字符串,Redis底层使用的一种简单动态字符串的抽象类型。
struct sdshdr {    in length:  # 记录buf中已使用字节的数量    int free;   # 记录bug数组中未使用的字节的数量    char buf[]; # 字节数组保存字符串}

优点:

  • 可以O(1)获取存储的键值的长度
  • 杜绝缓冲区溢出
  • 减少修改字符串带来的内存重分配次数【【【【【【【
  • 列表 列表的底层实现就是一个链表,链表的每个节点保存一个键值。
typedef struct listNode {    struct listNode *prev;  #前置节点    struct listNode *next;  #后置节点    void *value;            #节点的值} listNodetypedef struct list {    listNode *head;         #头节点    listNode *tail;         #尾节点    unsigned long len;      #节点数量    void *(*dup)(void *ptr);    #节点复制函数    void (*free)(void *ptr);    #节点释放函数    int (*match)(void *ptr, void *key)  #节点值对比函数}

示例:

127.0.0.1:6379> RPUSH integers 0 1 2 3 4 5 6(integer) 7127.0.0.1:6379> LLEN integers(integer) 7127.0.0.1:6379> LRANGE integers 0 101) "0"2) "1"3) "2"4) "3"5) "4"6) "5"7) "6"
  • 字典 Redis的字典使用哈希表作为底层实现,一个哈希表里可以有多个哈希表节点,每个哈希表节点就保存了字典中的 一个键值对。
typedef struct dictht {    dictEntry **table;      #哈希表数组    unsigned long size;     #哈希表大小    unsigned long sizemask; #哈希表大小掩码    unsigned long used;     #该哈希表已有节点的数量}dicthttypedef struct dictEntry {    void *key;    union {        void *val;        uint64_tu64;        int64_ts64;    } v;    struct dictEntry next;}dictEntrytypedef struct dict {    dictType * type;    # 类型特定函数    void *privatedata;  # 私有数据    dictht ht[2];       # 哈希表    int rehashidx;      #rehash 索引}
bc822d2108f8219ad48e6d7e794f2c22.png

当有一个新的键值对添加到字典中时,字典会对键进行哈希,得到哈希值后在和掩码进行与运算得到最终的哈希值 当有两个以上的键被分配到同一个哈希表数组的同一个索引上时,此时会产生键冲突。一般解决冲突有两种方法, 一种是Rehash,一种是链地址法。

  • 链地址法: 每个哈希表都有一个next指针,多个哈希表节点可以用next指针构成一个单向链表,被分配到同一个 索引上的多个节点可以用这个单向链表连接起来
  • Rehash: 随着哈希表中键值对增多和减少,为了使负载因子维持在一个合理的范围,需要对哈希表进行Rehash - 扩展,申请ht[1]的大小为大于ht[0].used*2的第一个2的次方的数,收缩,ht[1]为ht[0].used的第一个2的N次方的数。 - 执行rehash将ht[0]中的数值映射到ht[1]上 - 将ht[1]设置为ht[0],ht[1]新建一个空白哈希表
  • 跳跃表 跳跃表是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目.Redis使用跳跃表来实现有序集合键,和集群节点中的内部数据结构. redis使用的是zskiplist结构

zskiplist包含以下属性: header: 指向跳跃表的表头节点 tail: 指向跳跃表的表尾节点 level: 记录目前跳跃表内,层数最大的那个节点的层数 length: 记录跳跃表的长度即跳跃表目前包含的节点的数量

typedef struct zskiplistNode {    struct zskiplistLevel {    struct zskiplistNode *forward;    unsigned int span;  } level[];  struct zskiplistNode *backward;  double score;  robj *obj} zskiplistNodetypedef struct zskiplist{    structz skiplistNode *header, *tail;    unsigned long length;    int level;} zskiplist;

常用命令#

在设计Redis存储结构的时候,主要要考虑键和数据结构两方面 如果使用SET或者GETSET命令去更新键值, 键值的过期时间会被清除

127.0.0.1:6379> EXPIRE tea/1/box1/bag/8 300(integer) 1127.0.0.1:6379> TTL tea/1/box1/bag/8(integer) 260127.0.0.1:6379> SET tea/1/box1/bag/8 brewOK127.0.0.1:6379> TTL tea/1/box1/bag/8(integer) -1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460374.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

你好,C++(34)有一只叫做多利的羊 6.2.4 拷贝构造函数

6.2.4 拷贝构造函数 在C世界中,除了需要使用构造函数直接创建一个新的对象之外,有时还需要根据已经存在的某个对象创建它的一个副本,就像那只叫做多利的羊一样,我们希望根据一只羊创建出来另外一只一模一样的羊。例如&#xff1a…

invalid floating point operation什么意思_Point-MVSNet:基于多视角的点云重建网络

Point-Based Multi-View Stereo Network是一篇点云重建领域的文章,其工作内容为通过输入多张不同角度的图片,提取不同的点云特征,再进行融合,从而生成最终的点云。1.介绍Point-MVSNet的大致流程如下:首先生成一个粗略的…

在ubuntu 12.04上安装tomcat 7.40

因为源上的版本问题,所以没有使用源上的自动安装包,老规矩,Tomcat 7.0.40 Core下载地址:http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.40/bin /apache-tomcat-7.0.40.tar.gz 放入当前登录用户根目录: ~ 1、依旧是解压 t…

Nonblocking I/O 与 Asynchronous I/O

2019独角兽企业重金招聘Python工程师标准>>> Nonblocking IO 使用的是 polling (轮询)的方法(主动去问), 而 异步IO 使用的是信号机制(等待系统通知) 转载于:https://my.oschina.ne…

锐浪报表数据源access_kylin+SuperSet实现实时大数据报表的快速开发

最近我的团队将报表计算引擎从阿里的OLAP分析中间价迁移到了kylin上,解决了非常多的问题,将一些我们的解决方案分享出来,希望对读者或者在用kylin的人有所帮助。一、 之前现状和问题之前我们系统的报表都是基于阿里云的相关组件开发的&#x…

结构体定义的三钟方式

#include <stdio.h>#include <string.h>structStudent{ intid; charname[ 20 ]; intage;} s3; //定义方式3&#xff0c;不常用的一种方式intmain(){ structStudent s1; //定义方式1s1.id 0 ; strcpy (s1.name, "Zhang" ); s1.age 20 ; stru…

极大似然估计 摘自维基百科

最大似然估计[编辑] 原文地址&#xff1a; http://zh.wikipedia.org/wiki/%E6%9C%80%E5%A4%A7%E4%BC%BC%E7%84%B6%E4%BC%B0%E8%AE%A1 最大似然估计&#xff0c;也称为最大概似估计&#xff0c;是一种统计方法&#xff0c;它用来求一个样本集的相关概率密度函数的参数。这个方…

unity改变图片像素大小_类动森像素画反向转换 (xBR)

起因前阵子沉迷动森&#xff0c;DIY 样式的画风真的超萌(&#xff9f;д&#xff9f;)&#xff89;&#xff0c;恰巧在推上看到有个小姐姐在讨论这个像素画转换的算法&#xff0c;就想在 Unity 里整整。最后实现的镜头特效效果如下图。像素缩放算法常见的像素缩放算法对比图如下…

【记忆化搜索】bzoj3208 花神的秒题计划Ⅰ

暴力 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 701 const int dx[]{0,0,-1,1},dy[]{-1,1,0,0}; int n,mem[N][N],a[N][N],m; bool cant[N][N]; int f(int x,int y) {if(mem[x][y]) return mem[x][y];mem[x][…

c语言程序2

题目&#xff1a;有一分数序列&#xff1a;2/1&#xff0c;3/2&#xff0c;5/3&#xff0c;8/5&#xff0c;13/8&#xff0c;21/13...求出这个数列的前20项之和。1.程序分析&#xff1a;请抓住分子与分母的变化规律。2.程序源代码&#xff1a; #include "stdio.h" …

99 网络编程_传统网络工程师如何利用python实现公司内网IP地址信息查询?

网工圈网络工程师阿龙圈内最早的公益公众号,本号已认证&#xff01;学网络关注我一个就够了(关注近5w)关注听说99%的网工都来这里充电吖关注我&#xff0c;一个老HCIE(编号3558)带你轻松玩网络技术&#xff01; 交个朋友&#xff0c;一起和一个技术狂热者相互交流&#xff0c;共…

[原创]windows server 2012 AD架构试验系列 – 12 配置操作主机

[原创]windows server 2012 AD架构试验系列 – 12 配置操作主机ActiveDirectory支持域中所有域控制器之间的目录数据存储的多主机复制&#xff0c;因此域中的所有域控制器实质上都是对等的。ActiveDirectory支持域中所有域控制器之间的目录数据存储的多主机复制&#xff0c;因此…

应用沙盒

应用沙盒结构&#xff1a; 应用程序包&#xff1a;包含了所有的资源文件和可执行文件&#xff0c;这个压缩包的内容是不可以修改的。 Documents:保存应用程序运行时生成的需要持久化的的数据&#xff0c;ITunes同步设备时会备份该目录。 Library/Caches:保存应用程序运行时生成…

笔记本换内存条

步骤一 拆除护盖 笔记本内存插槽上都有护盖保护&#xff0c;首先第一步就是先将护盖拆掉。大多数笔记本的护盖上都有标识&#xff0c;有的是内凹的内存图形&#xff0c;而且从护盖的大小也能看出来&#xff0c;一般内存护盖的大小&#xff0c;就比内存条大一点。当然有不少笔记…

python更新es数据_python操作es增删改查

1.查询(search)# 获取案例库信息app.route(/get_dcn_cases, methods[GET, POST])def get_dcn_cases():# 告警事件数据dcn_cases_query {"_source": {"includes": ["faultName", "endTime", "startTime", "checked&quo…

angularJS 指令实践

AngularJS 指令&#xff08;Directives&#xff09;实践指南(1) 2014-03-12 10:22 陈鑫伟 编译 伯乐在线我要评论(0)字号&#xff1a;T|T一个指令用来引入新的HTML语法。指令是DOM元素上的标记&#xff0c;使元素拥有特定的行为。举例来说&#xff0c;静态的HTML不知道如何来创…

数据结构四双向链表

双向链表也叫双链表&#xff0c;是链表的一种&#xff0c;它的每个数据结点中都有两个指针&#xff0c;分别指向直接后继和直接前驱。所以&#xff0c;从双向链表中的任意一个结点开始&#xff0c;都可以很方便地访问它的前驱结点和后继结点。而之前的单链表为单向链表&#xf…

smtplib python教程_Python使用poplib模块和smtplib模块收发电子邮件的教程

poplib模块接收邮件python的poplib模块是用来从pop3收取邮件的&#xff0c;也可以说它是处理邮件的第一步。POP3协议并不复杂&#xff0c;它也是采用的一问一答式的方式&#xff0c;你向服务器发送一个命令&#xff0c;服务器必然会回复一个信息。pop3命令码如下&#xff1a;命…

C#发送电子邮件 (异步) z

///验证电子邮件的正则表达式 string emailStr "^([\w-\.])((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]\.)))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"; /// <summary> /// 异步发送电子邮件 /// </summary> /// <p…

Linux服务器的初步配置流程

开发网站的时候&#xff0c;常常需要自己配置Linux服务器。 本文记录配置Linux服务器的初步流程&#xff0c;也就是系统安装完成后&#xff0c;下一步要做的事情。这主要是我自己的总结和备忘&#xff0c;如果有遗漏&#xff0c;欢迎大家补充。 下面的操作针对Debian/Ubuntu系统…