当前位置: 首页 > 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 &…...

Know-Evolve: Deep Temporal Reasoning for Dynamic Knowledge Graphs

Know-Evolve: Deep Temporal Reasoning for Dynamic Knowledge Graphs Rakshit Trivedi 1 Hanjun Dai 1 Yichen Wang 1 Le Song 1 知识背景 Temporal Knowledge Graph : facts occur,recur or evolve over time in these graphs,and each edge in the graphs have temporal …...

电脑高效率工作、学习工具软件推荐

本文介绍在学习、工作时&#xff0c;实测很好用、明显提高工作效率的几个免费电脑软件与小工具。 1 Microsoft To Do 官方网站&#xff1a;https://todo.microsoft.com/tasks/ Microsoft To Do是一款由Microsoft公司开发的待办事项管理应用程序。它提供了一个简单易用的界面&a…...

Java8新特性函数式编程 - Lambda、Stream流、Optional

1.Lambda表达式 1.1 概述 ​ Lambda是JDK8中一个语法糖。他可以对某些匿名内部类的写法进行简化。它是函数式编程思想的一个重要体现。让我们不用关注是什么对象。而是更关注我们对数据进行了什么操作。 1.2 核心原则 可推导可省略 1.3 基本格式 (参数列表)->{代码}例一…...

AutoGPT安装教程

最近安装AutoGPT时遇到了一些问题&#xff0c;写下这篇文章记录一下 1 下载AutoGPT AutoGPT链接&#xff1a;https://github.com/Significant-Gravitas/Auto-GPT/tree/v0.2.2 下载AutoGPT 推荐下载stable 版本 2 申请openai 的api key 获取api的key&#xff0c;这里就不介…...

轻量级服务器nginx:负载均衡

负载均衡就是让每个设备&#xff0c;以同样的概率&#xff0c;处理用户对于服务器的任务请求&#xff0c;默认采用的负载调度策略就是轮流询问&#xff0c;Nginx作为反向代理服务器安装在服务端&#xff0c;Nginx的功能就是把请求转发给后面的应用服务器. 这里写目录标题 一 负…...

陶渊明最有名的10首诗,闲适美好

他是中国第一位田园诗人&#xff0c;被誉为“古今隐逸诗人之宗”、“田园诗派之鼻祖”。 他是诗人、辞赋家、散文家。 他是陶渊明。 欧阳修&#xff1a;晋无文章&#xff0c;唯陶渊明《归去来兮辞》。 陶渊明不为五斗米折腰&#xff0c;挂冠而去&#xff0c;给后世留下一段…...

最好用的六款虚拟机软件,赶紧收藏

在日常工作和学习中,我们常常需要在一台电脑上运行多个操作系统,以便进行软件测试、开发、学习以及实验等任务。虚拟机软件就是一种崭新的技术,它可以在一台电脑上运行多个操作系统,为用户提供了更高效、安全、稳定和智能化的工作和学习环境。今天我为大家介绍6款优秀的虚拟…...

LSSANet:一种用于肺结节检测的长、短切片感知网络

文章目录 LSSANet: A Long Short Slice-Aware Network for Pulmonary Nodule Detection摘要方法Long Short Slice GroupingLong Short Slice-Aware Network 实验结果 LSSANet: A Long Short Slice-Aware Network for Pulmonary Nodule Detection 摘要 提出了一个长短片感知网…...

LVS负载均衡群集部署—NAT

目录 一、群集的概述1、群集的含义2、出现高并发的解决方法3、群集的三种分类3.1负载均衡群集3.2高可用群集3.3高性能运算群集 4、负载均衡的结构 三、LVS调度器用的调度方法四、LVS的工作模式及其工作过程1.NAT模式&#xff08;VS-NAT&#xff09;2.直接路由模式&#xff08;V…...

【Access】win 10 / win 11:Access 下载、安装、使用教程(「管理信息系统」实践专用软件)

目录 一、前言 二、卸载 Office 三、下载 Office Tool Plus 四、安装 Office&#xff08;内含 Access&#xff09; &#xff08;1&#xff09;启动 Office Tool Plus &#xff08;2&#xff09;部署 &#xff08;3&#xff09;安装 Office&#xff08;内含 Access&#…...