当前位置: 首页 > news >正文

redis五大命令kv设计建议内存淘汰

什么是redis?主要作用?

redis(remote dictionary server)远程字典服务:是一个开源的使用ANSI C语言编写,支持网络、可基于内存可持久化的日志型、key-value数据库,并提供多种语言的api

redis的数据存在内存中,读写速度非常快,每秒可以超过10万次读写操作。因此广泛用于缓存,另外,redis也经常用来做分布式锁。

redis的基本数据类型

type key:获取key的类型

  • string

    • 是redis最基础的数据结构类型,可以存储图片或者序列化的对象,值最大存储为512M
    • 应用场景:共享session、计数器、限流等
    • 内部编码:int/embstr(<=39字节字符串)/raw(>39字节字符串)
    • 格式功能
      set key value将key-value缓存到Redis中
      get key从redis中获取key对应的value
      del key从Redis中删除key
      incr key将key对应的value加1
      decr key将key对应的value减1
      setex key seconds value将key-value缓存到Redis中并设置过期时间
      setnx key value将key-value缓存到redis中,若key存在,不做任何操作
      ttl key查看key的存活命时间
      incrby key increment给key对应值加increment
      mset k1 v1 k2 v2…批量添加key-value对到redis中
      mget k1 k2批量根据key获取value
      append key value在key对应的value中拼接value
      setrange key offset value从offset位置开始将key对应的value,替换为指定value
  • hash

    • hash类型是指v(值)本身又是一个键值对结构
    • 内部编码:ziplist、hashtable
    • 应用场景:缓存用户信息等
    • 注意:若开发使用hgetall,哈希元素比较多的话,可能导致redis阻塞,可以使用hscan.而如果只是获取部分field,建议使用hmget
    • 命令功能
      hset key field value将field value缓存到redis的hash中,键值为key
      hget key field从key对应hash中获取filed字段
      hexists key field判断key对应hash中是否存在field字段
      hincrby key field increment给key对应hash中的field字段+increment
      hdel key field删除key对应hash中的field字段
      hkeys key获取key对应hash中的所有field
      hvals key获取key对应hash中的所有filed的val
      hgetall key获取key对应hash中所有的filed和value
  • list

    • 用来存储多个有序的字符串,一个列表最多可以存储2^32-1个元素
    • 内部编码:ziplist、linkedlist
    • 应用场景:消息队列,收藏文章列表
      • lpush+lpop=stack
      • lpush+rpop=queue
      • lpsh+ltrim=capped collection(有序集合)
      • lpush+brpop=message queue(消息队列)
    • 命令功能
      rpush key value从右边向key集合中添加value
      lrange key start end从左边开始获取key集合,从start开始到end结束
      lpush key value从左边向key集合添加value
      lpop key弹出key集合最左边的数据
      rpop key弹出key集合最右边的数据
      llen key获取key集合的长度
      linsert key BEFORE|AFTER pivot element操作key集合,在privot之前/后添加element
      lset key index value操作key集合,更新索引index位置的值为value
      lrem key count value操作key集合,删除count个value值
      ltrim key start end操作key集合,截取start到end的列表值
      lindex key index操作key集合,获取index位置的值
      brpop key seconds延迟seconds弹出
  • set

    • 用来保存多个的字符串元素,但是不允许重复元素
    • 内部编码:intset、hashtable
    • 注意点:smembers和lrange、hgetall都属于比较重的命令,若元素过多存在阻塞redis的可能性,可以使用sscan完成
    • 应用场景:社交需求、生成随机数抽奖
    • 命令格式
      sadd key members向key集合中添加member元素
      smembers key遍历key集合中所有元素
      srem key members删除key集合中member元素
      spop key count从key集合中随机弹出count个元素
      sdiff key1 key2返回key1中特有的元素(差集)
      sidiffstore dest key1 key2将差集缓存到dest中
      sinter key1 key2返回key之间的交集
      sinterstore dest key1 key2将交集缓存到dest中
      sunion key1 key2返回并集
      sunionstore dest key1 key2将并集缓存到dest中
      smove source dest member将source集合中member元素移动到dest集合
      sismember key member判断member是否存在于key集合中
      srandmember key count随机获取key集合中count个元素
  • zset

    • 已排序的字符串集合,同时元素不能重复
    • 内部编码:ziplist、skiplist
    • 应用场景:排行榜、点赞
    • 命令格式
      zadd key score member向key集合中添加member元素,分数为score
      zincrby key increment member向key集合中member元素score+increment
      zrange key start end [withscores]将key集合中元素升序排序,显示分数
      zrevrange key start end [withscores]将key集合中元素倒序排序,显示分数
      zrank key member返回member在key集合中的正序排名
      zrevrank key member返回member在key集合中的倒序排名
      zcard key返回key集合元素的个数
      zrangebysocre key min max withscores按[min,max)分数范围正序返回key集合中的元素,显示分数
      zrevrangebyscore key min max withscores按[min,max)分数范围倒序返回key集合中的元素,显示分数
      zrem key member删除key集合中的member元素以及分数
      zremrangebyscore key min max withscores按[min,max)分数范围删除key集合中的元素
      zremrangebyrank key start stop删除key集合中按照正序排列,索引在[min,max)分数范围内的元素
      zcount key min max按[min,max)分数范围统计key集合中的元素个数
  • 全局命令

命令功能
keys pattern按照pattern模式匹配key
exists key判断key是否存在
expire key seconds设置key的过期时间
persist key取消key的过期时间
select index切换数据库,默认是第0个,共有0~15个
move key db从当前库将key移动到指定DB库
randomkey随机返回一个key
rename key newkey将key改名为newkey
echo message打印message信息
dbsize查询key个数
info查看redis数据库信息
config get *查看redis所有配置信息
flushdb清空当前数据库
flushall清空所有数据库
  • value设计

    • 一般模式

      • 是否需要排序,需要使用zset

      • 缓存的数据是多个值还是单个值

        • 多个值:是否允许重复,允许使用list,不允许使用set

        • 单个值:简单值选择string,对象值选择hash

    • 取巧模式

      • 除去需要排序的需求使用zset外,其余都使用string
  • key设计

    • 唯一性,常用缓存数据的主键作为key

    • 可读性,目的是为了确保见名知意

      • 普通单值,如userinfo:id1

      • 表名:主键名:主键值:列名,如userinfo:id:1:name

    • 灵活性

    • 时效性,redis key一定要设置过期时间

      • 不设置过期时间,key就为永久有效,会一直占用内存,当key的数量过多时,就容易达到服务器内存上限,导致宕机,所以一般要设置过期时间

      • key的时效性设置,必须根据业务场景进行评估,设置合理的有效时间

### 事务

  • 单个redis命令执行是原子性的,但是redis没有在事务上添加任何维持原子性的机制,所以redis的事务并不是原子性的

  • redis事务可以看为一组打包的批量执行脚本,因为其不具有原子性,所以中间的某条指令失败并不会导致之前的操作回滚,也不会导致后续操作失败

  • redis事务可以一次执行多个命令

    • 批量操作在发送exec命令前被放入queue中缓存

    • 接收到exec指令之后进入事务执行,事务中任意指令出错,不会导致其他指令失败及回滚

    • 在事务执行过程中,其他客户端提交的命令请求不会插入到该事务执行的命令队列中

持久化机制

  • 快照方式(RDB,redis database)

    • 将内存数据以快照的方式写入到二进制文件中,默认为dump.rdb

    • 手动触发

      • 使用save命令:会阻塞当前redis服务器,直到rdb过程完成,若内存数据过多,会造成长时间阻塞,影响其他命令的使用

      • 使用bgsave:redis进程执行fork指令创建子进程,由子进程实现rdb持久化

    • 自动触发

      • 使用save相关配置,save m n,表示m秒内数据集存在n次修改会自动触发bgsave命令

        • save 1000 19,表示1000s内若超过19个key被修改则发起快照保存
    • 优点

      • rdb快照文件是一个紧凑压缩的二进制文件,常使用于备份、全量复制等场景

      • redis加载rdb恢复数据远远快于aof的方式

    • 缺点

      • 无法做到实时持久化,每次bgsave都需要fork一个子进程,频繁执行有时间成本

      • rdb快照容易一起兼容性问题

  • 文件追加方式(AOF,append only file),不建议单独使用

    • 是一种独立日志的方式记录每次写命令,重启时在重新执行aof文件中命令达到回复数据的目的,解决了数据持久化的实时性问题

    • 默认未开启,需要在配置文件中将appendonly no改为appendonly yes

    • 文件同步策略

      • appendfsync always:收到命令就立即写到磁盘,效率慢,但是可以保证完全的持久化

      • appendfsync everysec:每秒写入磁盘一次

      • appendfsync no:完全依赖操作系统,一般同步周期是30s

    • 优点

      • 数据安全性更高,配置合理最多损失1s的数据量

      • 在不小心执行flushall命令,也可以通过aof方式恢复(删除最后一个命令即可)

      • 当aof变的太大时,redis能够在后台自动重写aof

    • 缺点

      • 相同数据量来说,aof文件体积大于rdb文件

      • aof比rdb持久化效率慢

  • 混合持久化方式(4.0之后)

    • 在写入的时候,先将当前的数据以rdb的方式写入文件开头,再将后续的操作命令以aof的格式存入文件,就是以rdb做全量备份,aof作为增量备份,来提高备份的效率。这样不仅能保证redis重启时的速度,又可以防止数据丢失的风险

内存淘汰机制

maxmemory参数设置内存使用上限 ,0代表不设置上限

  • LRU:最近最少使用,从数据库中删除最近最少访问的数据。可以理解为从数据库中删除最近最少访问的数据,长期不用的数据,意味着再次访问的概率也就很小了,淘汰的数据为最长时间未被使用的数据,仅与时间相关

  • LFU:最不经常使用,淘汰一段时间内,使用次数最少的数据,与频次和时间相关

  • TTL:Redis中设置了过期时间的数据,当内存不够时,并且该数据即将过期,就会直接清除该数据

  • 随机淘汰

  • 淘汰策略(通过maxmemory-policy配置)

    • volatile-lru:找出已经设置过期时间的数据集,将最近最少使用的数据淘汰掉

    • volatile-ttl:找出已经设置过期时间的数据集,将即将过期的数据淘汰掉

    • volatile-random:找出已经设置过期时间的数据集,随机淘汰数据

    • volatile-lfu:找出已经设置过期时间的数据集,将一段时间内,使用次数最少的数据淘汰掉

    • allkeys-lru:与1类似,只不过为全体数据

    • allkeys-lfu:与4类似,只不过为全体数据

    • allkeys-random:与3类似,只不过为全体数据

    • no-enviction:什么都不做,直接报错,通知内存不足,可以保证数据不丢失(默认)

相关文章:

redis五大命令kv设计建议内存淘汰

什么是redis&#xff1f;主要作用&#xff1f; redis(remote dictionary server)远程字典服务&#xff1a;是一个开源的使用ANSI C语言编写&#xff0c;支持网络、可基于内存可持久化的日志型、key-value数据库&#xff0c;并提供多种语言的api redis的数据存在内存中&#xff…...

如何真正认识 Linux 系统结构?这篇文章告诉你

Linux 系统一般有 4 个主要部分&#xff1a;内核、shell、文件系统和应用程序。内核、shell 和文件系统一起形成了基本的操作系统结构&#xff0c;它们使得用户可以运行程序、管理文件并使用系统。 Linux内核 内核是操作系统的核心&#xff0c;具有很多最基本功能&#xff0c;…...

【移动端网页布局】流式布局案例 ① ( 视口标签设置 | CSS 样式文件设置 | 布局宽度设置 | 设置最大宽度 | 设置最小宽度 )

文章目录 一、视口标签设置二、CSS 样式文件设置三、布局宽度设置1、设置布局宽度2、设置布局最大宽度3、设置布局最小宽度4、查看网页最大最小宽度5、布局宽度设置 四、代码示例1、主界面标签2、CSS 布局设置 一、视口标签设置 参考 【移动端网页布局】移动端网页布局基础概念…...

力扣---LeetCode88. 合并两个有序数组

文章目录 前言88. 合并两个有序数组链接&#xff1a;方法一&#xff1a;三指针(后插)1.2 代码&#xff1a;1.2 流程图&#xff1a;方法二&#xff1a;开辟新空间2.1 代码&#xff1a;2.2 流程图&#xff1a;2.3 注意&#xff1a; 总结 前言 “或许你并不熠熠生辉甚至有点木讷但…...

H7-TOOL的CANFD Trace全解析功能制作完成,历时一个月(2023-04-28)

为了完成这个功能&#xff0c;差不多耗费了一个月时间&#xff0c;精神状态基本已经被磨平了。 当前已经支持&#xff1a; 1、LUA小程序控制&#xff0c;使用灵活。 2、采用SWD接口直接访问目标板芯片的CANFD外设寄存器和CANFD RAM区实现&#xff0c;支持USB&#xff0c;以太网…...

探析Android中的四类性能优化

作者&#xff1a;Yj家的孺子牛 流畅性优化 主线程模型 了解 Android 的流畅性优化之前&#xff0c;我们需要先了解Android的线程结构。在 Android 中&#xff0c;有一个主线程模型&#xff0c;其中所有的绘制以及交互都是在主线程中进行的&#xff0c;所以&#xff0c;当我们…...

ubuntu18.04 安装编译zlmediakit

参考http://www.cherrylord.cn/archives/zlmediakit 1、获取代码 #国内用户推荐从同步镜像网站gitee下载 git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit cd ZLMediaKit #千万不要忘记执行这句命令 git submodule update --init#国内用户推荐…...

C++ -5- 内存管理

文章目录 C语言和C内存管理的区别示例1. C/C 中程序内存区域划分2. C中动态内存管理3.operator new 与 operator delete 函数4.new 和 delete 的实现原理5.定位new表达式 C语言和C内存管理的区别示例 //C语言&#xff1a; struct SListNode {int data;struct SListNode* next; …...

(Linux)在Ubuntu系统中添加新用户并授予root权限

向Ubuntu系统中添加新用户并为其授予root权限的步骤如下: 打开终端Terminal 输入命令: sudo su - 以 root 身份登录. 注: sudo su : 切换root身份, 不携带当前用户环境变量 sudo su - : 切换root身份, 携带当前用户环境变量 输入命令: adduser username 向Ubuntu系统中添…...

AttributeError: ‘ChatGLMModel‘ object has no attribute ‘prefix_encoder‘

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

Huggingface的GenerationConfig 中的top_k与top_p详细解读

Huggingface的GenerationConfig 中的top_k与top_p详细解读 Top_kTop_p联合共用 Top_k top-k是指只保留概率最高的前k个单词&#xff0c;然后基于剩余单词的概率进行归一化&#xff0c;从中随机抽取一个单词作为最终输出。这种方法可以限制输出序列的长度&#xff0c;并仍然保持…...

学生信息管理系统简易版(文件读写操作)

功能模块 具体功能如下&#xff1a; 添加学生信息修改学生信息&#xff08;按学号&#xff09;排序&#xff08;分别按总分升序、降序、以及按姓名升序&#xff09;查找学生&#xff08;按学号&#xff09;删除学生查看所有学生信息 数据结构体设计 本表设计一个学生信息的结…...

C/C++每日一练(20230426)

目录 1. 不喜欢带钱的小C &#x1f31f;&#x1f31f; 2. 数组排序 ※ 3. 超级素数 ※ &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 不喜欢带钱的小C 小C不喜欢带钱&#xff0c…...

halcon灰度积分投影/垂直积分投影

简介:关于灰度投影积分可以用到的场合很多,例如分割字符,分割尺子上的刻度等,适用于有规律的变化这些内容的检测。本文复现了论文《基于深度学习和灰度纹理特征的铁路接触网绝缘子状态检测》中灰度积分投影实现了对绝缘子缺陷位置的检测。见(图1)灰度积分垂直方向投影获得…...

Unity打包的apk在安卓4.4.2盒子上碰到的问题

项目场景&#xff1a; Unity开发的项目需要在安卓4.4.2盒子上运行。 问题描述 1、会出"从顶部向下滑动即可退出全屏模式。"的弹框&#xff0c;这是android4.4的一个特性&#xff0c;叫做沉浸模式&#xff08;Full-screen Immersive Mode)&#xff0c;当app启用该模…...

docker的简单使用(centos7中为例)

安装&#xff1a; yum -y install docker 启动&#xff1a; service start docker 搜索镜像&#xff1a; docker search centos:7.9 下载镜像&#xff1a; docker pull docker.io/18703283952/mycentos 查看所有镜像&#xff1a; docker images 启动并进入镜像&#xff1a…...

Stable Diffusion人工智能图像合成

AI 图像生成大有来头。新发布的开源图像合成模型称为Stable Diffusion&#xff0c;它允许任何拥有 PC 和像样的 GPU 的人想象出他们能想象到的几乎任何视觉现实。它几乎可以模仿任何视觉风格&#xff0c;如果你给它输入一个描述性的短语&#xff0c;结果就会像魔术一样出现在你…...

【Java EE】-CSS详解

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【JavaEE】 分享: 且视他人如盏盏鬼火&#xff0c;大胆地去走你的道路。——史铁生《病隙碎笔》 主要内容&#xff1a;CSS引入html的三种方式&#xff0c;CSS八大选择器&#xff…...

C#_语言简介

目录 1. C# 简介 2. Visual Studio 窗口界面显示 1. C# 简介 什么是程序&#xff1f; 程序&#xff08;Program&#xff09;简单来说就是&#xff1a; 计算机是无法听懂我们人类的语言的&#xff0c;也可以说我们通过我们日常交流的语言是无法控制计算机的&#xff0c;计算机…...

【Python_Opencv图像处理框架】直方图与傅里叶变换

写在前面 本篇文章是opencv学习的第五篇文章&#xff0c;主要讲解了直方图与傅里叶变换的有关操作&#xff0c;作为初学者&#xff0c;我尽己所能&#xff0c;但仍会存在疏漏的地方&#xff0c;希望各位看官不吝指正&#x1f970; 写在中间 一、直方图 &#xff08; 1 &…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...