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?主要作用? redis(remote dictionary server)远程字典服务:是一个开源的使用ANSI C语言编写,支持网络、可基于内存可持久化的日志型、key-value数据库,并提供多种语言的api redis的数据存在内存中ÿ…...
如何真正认识 Linux 系统结构?这篇文章告诉你
Linux 系统一般有 4 个主要部分:内核、shell、文件系统和应用程序。内核、shell 和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。 Linux内核 内核是操作系统的核心,具有很多最基本功能,…...
【移动端网页布局】流式布局案例 ① ( 视口标签设置 | CSS 样式文件设置 | 布局宽度设置 | 设置最大宽度 | 设置最小宽度 )
文章目录 一、视口标签设置二、CSS 样式文件设置三、布局宽度设置1、设置布局宽度2、设置布局最大宽度3、设置布局最小宽度4、查看网页最大最小宽度5、布局宽度设置 四、代码示例1、主界面标签2、CSS 布局设置 一、视口标签设置 参考 【移动端网页布局】移动端网页布局基础概念…...
力扣---LeetCode88. 合并两个有序数组
文章目录 前言88. 合并两个有序数组链接:方法一:三指针(后插)1.2 代码:1.2 流程图:方法二:开辟新空间2.1 代码:2.2 流程图:2.3 注意: 总结 前言 “或许你并不熠熠生辉甚至有点木讷但…...
H7-TOOL的CANFD Trace全解析功能制作完成,历时一个月(2023-04-28)
为了完成这个功能,差不多耗费了一个月时间,精神状态基本已经被磨平了。 当前已经支持: 1、LUA小程序控制,使用灵活。 2、采用SWD接口直接访问目标板芯片的CANFD外设寄存器和CANFD RAM区实现,支持USB,以太网…...
探析Android中的四类性能优化
作者:Yj家的孺子牛 流畅性优化 主线程模型 了解 Android 的流畅性优化之前,我们需要先了解Android的线程结构。在 Android 中,有一个主线程模型,其中所有的绘制以及交互都是在主线程中进行的,所以,当我们…...
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语言: 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个单词,然后基于剩余单词的概率进行归一化,从中随机抽取一个单词作为最终输出。这种方法可以限制输出序列的长度,并仍然保持…...
学生信息管理系统简易版(文件读写操作)
功能模块 具体功能如下: 添加学生信息修改学生信息(按学号)排序(分别按总分升序、降序、以及按姓名升序)查找学生(按学号)删除学生查看所有学生信息 数据结构体设计 本表设计一个学生信息的结…...
C/C++每日一练(20230426)
目录 1. 不喜欢带钱的小C 🌟🌟 2. 数组排序 ※ 3. 超级素数 ※ 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 不喜欢带钱的小C 小C不喜欢带钱,…...
halcon灰度积分投影/垂直积分投影
简介:关于灰度投影积分可以用到的场合很多,例如分割字符,分割尺子上的刻度等,适用于有规律的变化这些内容的检测。本文复现了论文《基于深度学习和灰度纹理特征的铁路接触网绝缘子状态检测》中灰度积分投影实现了对绝缘子缺陷位置的检测。见(图1)灰度积分垂直方向投影获得…...
Unity打包的apk在安卓4.4.2盒子上碰到的问题
项目场景: Unity开发的项目需要在安卓4.4.2盒子上运行。 问题描述 1、会出"从顶部向下滑动即可退出全屏模式。"的弹框,这是android4.4的一个特性,叫做沉浸模式(Full-screen Immersive Mode),当app启用该模…...
docker的简单使用(centos7中为例)
安装: yum -y install docker 启动: service start docker 搜索镜像: docker search centos:7.9 下载镜像: docker pull docker.io/18703283952/mycentos 查看所有镜像: docker images 启动并进入镜像:…...
Stable Diffusion人工智能图像合成
AI 图像生成大有来头。新发布的开源图像合成模型称为Stable Diffusion,它允许任何拥有 PC 和像样的 GPU 的人想象出他们能想象到的几乎任何视觉现实。它几乎可以模仿任何视觉风格,如果你给它输入一个描述性的短语,结果就会像魔术一样出现在你…...
【Java EE】-CSS详解
作者:学Java的冬瓜 博客主页:☀冬瓜的主页🌙 专栏:【JavaEE】 分享: 且视他人如盏盏鬼火,大胆地去走你的道路。——史铁生《病隙碎笔》 主要内容:CSS引入html的三种方式,CSS八大选择器ÿ…...
C#_语言简介
目录 1. C# 简介 2. Visual Studio 窗口界面显示 1. C# 简介 什么是程序? 程序(Program)简单来说就是: 计算机是无法听懂我们人类的语言的,也可以说我们通过我们日常交流的语言是无法控制计算机的,计算机…...
【Python_Opencv图像处理框架】直方图与傅里叶变换
写在前面 本篇文章是opencv学习的第五篇文章,主要讲解了直方图与傅里叶变换的有关操作,作为初学者,我尽己所能,但仍会存在疏漏的地方,希望各位看官不吝指正🥰 写在中间 一、直方图 ( 1 &…...
手把手教你解决HarmonyOS项目中的hvigor版本冲突问题(含API8/9兼容方案)
HarmonyOS开发实战:彻底解决hvigor版本冲突与API兼容性问题 上周团队新来的工程师小王在调试P40设备时突然惊呼:"这报错太诡异了!明明代码没问题,为什么安装包死活装不上?"我凑近一看,控制台正显…...
从‘它怎么又挂了’到‘服务稳如狗’:我是如何用Prometheus+Grafana搭建业务监控看板的
从被动救火到主动防御:PrometheusGrafana构建业务监控实战手册 凌晨三点,手机突然响起刺耳的警报声——这已经是本周第三次了。揉着惺忪的睡眼查看日志,却发现关键线索早已被淹没在海量的调试信息中。这样的场景对于中小技术团队来说再熟悉不…...
SDXL-Turbo实战教程:从A futuristic car到motorcycle的删改逻辑教学
SDXL-Turbo实战教程:从A futuristic car到motorcycle的删改逻辑教学 获取更多AI镜像 想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,…...
openEuler系统下NFS服务器配置实战:多场景权限管理与安全优化
1. NFS服务基础与openEuler环境准备 NFS(Network File System)是Linux系统中实现文件共享的经典方案,它允许不同主机通过网络访问远程文件系统,就像操作本地文件一样方便。在openEuler这个企业级Linux发行版上配置NFS服务…...
Android 11文件权限避坑指南:为什么你的APP无法修改原文件?
Android 11存储权限深度解析:从沙盒机制到实战解决方案 在去年的一次应用升级中,我们团队遇到了一个棘手的问题:用户反馈图片编辑后无法保存到原位置。经过排查,发现这是Android 11引入的存储权限机制变化导致的。作为开发者&…...
「码动四季·开源同行」go实战案例:如何在 Go 微服务中实现负载均衡?
在上文章中,我们已经介绍了负载均衡的相关概念以及在服务高可用架构中的重要性,也了解了几种主流负载均衡算法的实现。在本文中,我们将在Go微服务实例中具体使用负载均衡技术,并详细说明如何基于服务发现来实现负载均衡的微服务间…...
别再手动改Hosts了!用K8S Gateway API轻松搞定基于请求头的AB测试(OpenResty实战)
告别手动配置:基于K8S Gateway API的智能AB测试实战指南 每次功能迭代时,你是否还在反复修改本地Hosts文件来切换测试环境?或是为了验证某个接口在不同版本间的表现差异,不得不频繁重启服务或调整代理配置?这种低效的手…...
5大核心能力解析:YimMenu如何重塑GTA5游戏体验与安全防护
5大核心能力解析:YimMenu如何重塑GTA5游戏体验与安全防护 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/Y…...
高效数据采集解决方案:快手内容获取工具的技术实现与应用指南
高效数据采集解决方案:快手内容获取工具的技术实现与应用指南 【免费下载链接】kuaishou-crawler As you can see, a kuaishou crawler 项目地址: https://gitcode.com/gh_mirrors/ku/kuaishou-crawler 在信息爆炸的时代,如何高效、合规地获取网络…...
Cadence Allegro 17.4进阶技巧:PCB Editor中高效调整丝印的三大步骤
1. 丝印调整的核心价值与准备工作 在PCB设计流程中,丝印调整往往被新手工程师视为"收尾环节",但实际它直接影响着后续生产的可制造性和产品维护的便利性。Cadence Allegro 17.4的PCB Editor模块提供了完整的丝印处理工具链,我经手…...
