Redis

Redis7系列:Redis对决RedisStack Redis 是一个开源的内存数据库,以高性能、低延迟著称,支持基础数据结构(如字符串、哈希、列表、集合、有序集合等),常用于缓存、消息队列、实时数据处理等场景。Redis Stack 是 Redis 的扩展版本,整合了 Redis 核心数据库与多个高级功能模块(如全文搜索、JSON 文档存储、图数据库、时间序列等),提供“一站式”解决方案,简化了复杂数据场景的开发。 阅读详情

转载

一、简介

redis就是一个数据库,不过是在内存中的,存取速度快,被广泛用于缓存,分布式锁,支持事务,集群。
高性能,高并发。

1.1 为什么用redis

缓存分为本地缓存和分布式缓存,以java为例,使用自带的map或者guava实现的是本地缓存,最主要特点是轻量和快速,声明周期随着jvm的销毁而结束。
redis或memcached被称为分布式缓存,缓存具有一致性,缺点是要保持redis或memcached服务的高可用,程序架构上比较复杂。

1.2 redis与memcached区别

  1. redis支持更丰富的数据类型,k/v,list,set,zset,hash。memcache支持简单的数据类型,String.
  2. Redis支持数据的持久化,将内存中的数据保存再磁盘中,重启的时候可以再次加载使用,Memcached把数据全部存在内存中
  3. 集群模式,redis目前是原生支持cluster模式。
  4. Memcached是多线程,非阻塞IO复用的网络模型,Redis使用单线程的多路IO复用模型

1.3 redis设置过期时间

数据过期后,如何删除数据
定期删除+惰性删除
默认每隔100ms随机抽取一些设置了过期时间的key,检查是否过期,过期则删除
当系统查到key到期了,删除

1.4 redis 内存淘汰机制

大量key堆积在内存里导致内存块耗尽

  • volatile-lru: 从已设置过期时间的数据集中挑最近最少使用的数据淘汰
  • volatile-ttl: 从已设置过期时间的数据集中挑选将要过期的数据淘汰
  • volatile-random: 从已设置过期数据的数据集中任意选择数据淘汰
  • allkeys-lru: 当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(最常使用)
  • allkeys-random: 从数据集中任意选择数据淘汰
  • no-eviction: 禁止驱逐数据,当内存不足禁止写入数据

1.5 redis 持久化机制

快照(snapshotting)持久化(RDB)

Redis可以通过创建快照来获得存储在内存里面的数据在某个时间点上的副本。Redis创建快照之后,可以对快照进行备份,可以将快照复制到其他服务器从而创建具有相同数据的服务器副本(Redis主从结构,主要用来提高Redis性能),还可以将快照留在原地以便重启服务器的时候使用
快照持久化是Redis默认采用的持久化方式

追加文件(append-only file)

开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件。AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof。
在Redis的配置文件中存在三种不同的 AOF 持久化方式,它们分别是:

appendfsync always     #每次有数据修改发生时都会写入AOF文件,这样会严重降低Redis的速度
appendfsync everysec  #每秒钟同步一次,显示地将多个写命令同步到硬盘
appendfsync no      #让操作系统决定何时进行同步

1.6 缓存雪崩和缓存穿透问题解决方案

缓存雪崩

缓存同一时间大面积失效,后面的请求落在数据库上,造成数据库短时间内承受大量请求而崩掉

  • 事前:尽量保证整个redis集群的高可用性,发现机器宕机尽快补上,选择合适的内存淘汰策略
  • 事中: 本地缓存,限流+降级,避免MySQL崩掉
  • 事后: 利用redis持久化机制保存的数据尽快恢复

缓存穿透

一般是黑客故意去请求缓存中不存在的数据, 导致所有请求都落在数据库上

  • 一般是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个拦截,从而避免对底层存储系统的查询压力
  • 简单粗暴,如果一个查询返回的数据为空,我们仍然将这个空结果缓存,过期时间很短,不超过五分钟。

1.7 如何解决redis的并发竞争Key问题

多个系统同时对一个key进行操作,但是执行顺序和我们期望的不同
分布式锁(zookeeper和redis度可以实现分布式锁)
分布式锁

1.8 如何保证缓存与数据库双写时的数据一致性

一般来说,就是如果你的系统不是严格要求缓存+数据库必须一致性的话,缓存可以稍微的跟数据库偶尔有不一致的情况,最好不要做这个方案,读请求和写请求串行化,串到一个内存队列里去,这样就可以保证一定不会出现不一致的情况
串行化之后,就会导致系统的吞吐量会大幅度的降低,用比正常情况下多几倍的机器去支撑线上的一个请求。

二、数据结构

String

set,get,decr,incr
简单的key-value类型

set key value
get key
del key
mset key1 value1 key2 value2
mget key1 key2
expire key1 5 # 5秒后过期
setex key2 5 value2
setnx name value # 不存在就创建
set age 30
incr age
incrby age 5
incrby age -5

Hash

hget,hset

hset maps java "think in java" # valu如果包含空格,需要引号
hgetall maps # 获取key,value
hlen maps
hget maps java
hmset maps java "v1" python "v2"

类似于java的hashMap

List

lpush,rpush,lpop,rpop,lrange
链表,应用场景很多,双向链表,反向查找,遍历

rpush books python java golang # 3个元素
llen books
lpop books
rpop books
rpush books value
ltrim books startindex endindex # -1表示倒数第一个

Set

sadd,spop,smembers

sadd books python
smembers books # 无序
sismember books java# 查看是否存在
scard books # 获取长度
spop books # 弹出一个

类似于列表的功能,特殊之处在于set是可以自动排重的

Sorted Set

zadd,zrange,zrem,zcard

zadd books 9.0 "a"
zadd books 8.0 "b"
zrange books 0 -1 # 按score排序从小到大输出
zcard books # 长度
zrangebyscore books 0 8.0 # 根据区间输出 后面可以加 withscores

比set增加了权重参数score,使得集合中的元素能够按score进行有序排列

三

3.1 位图

redis提供了位图数据结构,可以自动拓展
可以支持零整存取操作

setbit w 1 1
getbit w 1 1
set w h
get w
bitcount 统计指定位置范围1的个数 [start, end]
bitpos 用来查找指定范围内出现的第一个0或1

3.2 HyperLogLog统计UV

Redis提供的用于不精确的去重技术方案,标准误差0.81%。一个log需要占据12k的存储空间,所以不适合统计单个用户的相关数据。
原理:给定一系列的随机整数,我们记录下低位连续零位的最大长度 k,通 过这个 k 值可以估算出随机数的数量

pfadd 增加计数
pfcount 获取计数

3.3 布隆过滤器-推荐去重

布隆过滤器能准确过滤掉那些已经看过的内容,那些没有看过 的新内容,它也会过滤掉极小一部分 (误判),但是绝大多数新内容它都能准确识别。这样就 可以完全保证推荐给用户的内容都是无重复的。原理就是使用位图和几个无偏哈希函数,本质上就是取哈希,如果哈希冲突就认为重合,所以存在误判。

bf.add codehole user1
bf.exists codehole user2

3.4 限流-断尾求生

1 简单实现

zset加上时间窗口

2 漏斗限流

redis-cell模块

cl.throttle laoqian:reply 15 30 60 1
laoqian:reply : key
初始容量为15 频率行为60s最多30次,1是可选参数默认值为1

3.4 进水楼台-GeoHash

GeoHash算法,将二维经纬度映射到一维。
Geo内部就是一个普通的zset结构

geoadd company 116.43 39.99 juejin
geodist company a b km
geopos company juejin
geohash company juejin # 获取哈希编码
georadiusbymember company juejin 20 km count 3 asc #获取最近公司
georadius company 116.5345 39.434 20 km withdist count 3 asc 根据经纬度

3.5 大海捞针-sacn

  1. keys算法可以支持正则匹配所有key keys codehole*
  2. sacn 0 match key99* count 10 // count表示单次遍历的槽数
  3. //0表示游标,服务器不记住寻找的状态
【Redis】Redis入门 redis入门基础、Linux下安装redis 阅读详情

相关推荐

Redis Redis介绍、安装 - Redis客户端

目录redis是什么,他的应用场景是什么?Redis的一些主要特点和应用场景:redis的官方网站:Redisredis是键值型数据库:(也就是key-value模式)(跟python的字典很像)认识NoSQL?SQL和NoSQL的区别数据库结构之间的区别数据库关联之间的区别SQL查询和非SQL查询的区别事务上的差异总结认识Redis特征:一、安装Redis1、单机安装Redis(linux安装 – Centos7.9)1.1、安装Redis依赖(Redis是基于C语言编译的,因此首先需要安装Redis所需

m0_51274464的博客 1534

Redis(5) Redis持久化操作超详细讲解!!

一、RDB 是指在时间间隔内将内存中的数据集快照写入磁盘。Redis会单独创建一个子进程来进行持久化,会先将数据写入一个临时文件中,待持久化都结束了,再用这个临时文件替换上一次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能,如果需要进行大规模的数据恢复,且对于恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加高效,RDB的缺点是最后一次持久化后的数据可能会丢失 ...

Jjs_Object的博客 1037

【Redis】Redis基础——Redis的安装及启动

GitHub上的大神编写了Redis的图形化桌面客户端,不过该仓库提供的是RedisDesktopManager的源码,并未提供windows安装包。# 利用redis-cli来执行 shutdown 命令,即可停止 Redis 服务,因为之前配置了密码,因此需要通过 -u 来指定密码。当然,在连接redis时指定密码,还能连接后使用 AUTH 指定用户名和密码,这里我没有用户名,直接指定密码就好了。2. 修改redis.conf文件中的一些配置,进入后,输入/,在输入内容回车就能搜索到了。

菜鸟的博客 4527

【Redis】AOF日志的三种写回机制

redis的AOF(Append Only File)持久化提供了三种不同的写回策略,通过appendfsync配置项来控制,这三种策略在数据安全性和性能之间提供了不同的权衡选择。3、主线程不阻塞,后台线程每秒检查一次缓冲区,缓冲区有数据就执行fsync()同步到磁盘。1、每次写入命令后立即执行fsync,将数据同步到磁盘。2、确保每个写命令都持久化到磁盘后才返回成功响应。3、立即调用fsync()将缓冲区内容写入磁盘。2、命令追加到AOF缓冲区。2、命令追加到AOF缓冲区。2、命令追加到AOF缓冲区。

qq_45795794的博客 909

方案设计之亿级排行榜方案设计

该方案通过 “Redis Zset 为核心 + 分治策略为骨架 + 多级优化为细节”,在亿级用户场景下实现了:本质是将 “亿级大问题” 拆解为 “千万级小问题”,用分布式思想和精细化设计平衡性能、可用性与成本。

shine0312的专栏 1099

CHARLS数据库下载避坑指南:从注册到数据获取的完整流程(2023最新版)

本文提供2023年最新版CHARLS数据库下载与使用全流程指南,涵盖从注册、数据申请到清洗的高效实践。重点解析邮箱选择、协议签署等关键步骤,并分享多线程下载、格式转换等实用技巧,助力研究者快速获取并处理这一中国中老年健康研究的黄金标准数据。

red88的博客 915

Redis的appendfsync参数详解

redis.conf中的appendfysnc是对redis性能有重要影响的参数之一。可取三种值:always、everysec和no。 设置为always时,会极大消弱Redis的性能,因为这种模式下每次write后都会调用fsync(Linux为调用fdatasync)。 如果设置为no,则write后不会有fsync调用,由操作系统自动调度刷磁盘,性能是最好的。 everysec为最多...

一见 1万+

CAPL编程的催化剂——CAPLdll的实现

CANoe作为一款功能强大的总线开发及测试工具,不仅仅是因为其丰富的库函数,最重要的是其兼容了多种编程语言,可以实现灵活的开发,极大的解决了纯CAPL编程所带来的限制,如通过动态链接库(DLL)来实现复杂函数的编写,使其能够在CAPL中可以调用,下面将对DLL的实现进行分析。capldll.cpp这个文件初看相当复杂,从整体上来说,这段代码主要包含了两部分:自定义函数实现和回调函数定义,今天的主要任务是实现自定义函数,这里的函数定义与普通函数定义差不多,只是利用了CAPL的格式。在VS2017工程中打开。

车载控制器AutoSAR软件开发工程师 4646

Redis持久化机制

一、Redis持久化机制介绍 RDB和AOF两种持久化机制的介绍: redis持久化:RDB,AOF 1)、RDB持久化机制,对redis中的数据进行周期性的持久化。 2)、AOF机制对每条写入命令作为日志,以append-only的模式写入一个日志文件中,在redis重启的时候,可以通过回放AOF日志中的写入指令来重新构建整个数据集。 3)、通过RDB或AOF,都可以将redis内存中的数据给持久化到磁盘上,然后可以将这些数据备份到别的地方,比如说阿里云,华为云等云服务。此时如果redis挂了,服务器上的

weixin_38910645的博客 329

【HarmonyOS 5】鸿蒙APP使用【团结引擎Unity】开发的案例教程

以下是基于团结引擎开发鸿蒙Unity应用的详细案例教程,整合环境配置、工程适配、跨语言通信等核心环节。

2201_75709314的博客 2482

实战指南:将MediaPipe封装为Windows DLL,实现C++/C#高效调用

在计算机视觉和多媒体处理领域,跨平台框架为开发者提供了强大的算法模型和计算能力。其核心原理在于通过预训练的机器学习模型和优化的计算图,实现对图像、视频流中特定目标(如人脸、手势、姿态)的实时检测与分析。这项技术的价值在于能够将复杂的AI能力模块化,降低应用开发门槛。在实际工程实践中,为了突破特定语言生态的限制并优化部署流程,开发者常需将核心功能封装成独立的库。例如,将Google的MediaPipe框架封装为Windows动态链接库(DLL),就是一个典型的工程实践。此举能有效解决语言壁垒和部署简化问题,使

weixin_28691741的博客 360

修改redis中AOF备份方式

启用AOF命令: config set appendonly yes 之后将两个conf文件中的appendonly处改为yes ,否则当redis服务重启时将会appendonly改回no 如下图示: 然后再执行config set appendfsync always 命令(为了保证不丢失数据,appendfsync always是最安全的。) #每次有新命令追加到 AOF 文件时就执行一次 ...

u011265702的博客 729

金蝶云星空API实战:从零到一,用Postman打通业务数据流

本文详细介绍了如何使用Postman调试金蝶云星空API,从创建第三方应用到实战调试技巧,帮助开发者快速打通业务数据流。文章重点讲解了API配置的关键细节、常见问题排查方法以及自动化测试方案,提升开发效率与准确性。

weixin_33712987的博客 516

Redis(Redis基础,SpringCache,SpringDataRedis)

本文详细讲解了redis基础内容,以及Spring Cache,Spring Data Redis技术的使用

qq_49474843的博客 2940

Anomalib实战:5分钟搞定图像异常检测模型训练(附完整代码)

本文提供了一份基于Anomalib框架的图像异常检测快速实战指南。文章详细介绍了从环境搭建、数据准备到模型训练与推理的完整流程,重点推荐了训练速度快、效果稳定的PatchCore模型,并附带了可运行的完整代码,旨在帮助开发者快速上手工业质检等实际应用。

weixin_29039773的博客 419

【unity实战】Unity游戏开发:如何用ScriptableObject与序列化多态实现可复用的模块化效果系统?

本文介绍了两种实现卡牌游戏效果系统的模块化设计方案。方案一使用ScriptableObject创建独立的效果资产,通过组合实现不同效果,优点是数据可复用、可视化编辑,缺点是同类不同参数效果需创建大量SO文件。方案二利用SerializeReference特性直接嵌套效果实例,避免SO文件过多,但需要插件支持编辑器多态显示。两种方案都将效果与卡牌解耦,提高了代码复用性和扩展性,解决了硬编码带来的重复、维护困难和扩展不便等问题。开发者可根据项目需求选择合适方案,或结合两者优势构建更灵活的系统。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 435

【Redis】初识 Redis

本期内容主要介绍Redis是什么,认识 Redis,介绍 Redis 的特性以及 Redis 为什么快,并简单介绍了分布式系统。

爱编程爱运动的博客 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【Redis】Redis键值存储

首先要强调一点:Redis是key value类型的数据库,Redis所说的数据类型都是key value中的value的数据结构,而key都是字符串。在本文中,我们对Redis的键值存储进行了全面的概述和介绍。首先,我们了解了Redis的五大基本数据类型:String(字符串)、Hash(哈希)、List(列表)、Set(集合)和Zset(有序集合),并探讨了它们各自的特点和用法。

白晨的博客 2237

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【Redis】Redis的启航之路:Ubantu操作系统下安装Redis

【Redis安装与配置指南】本文详细介绍了Redis数据库的安装步骤:通过apt获取安装包(Y确认安装),用netstat验证服务启动(默认6379端口)。重点讲解了配置文件修改:将IP从127.0.0.1改为0.0.0.0、关闭保护模式以允许远程连接,并重启服务生效。最后演示了使用redis-cli客户端连接服务器及ping测试连通性(返回PONG即成功)。全文提供完整命令行操作指引,适合Redis初学者快速搭建环境。

GGBond778的博客 1968

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Redis——Redis简介

Redis简介、Reids5新特性、基本数据类型:String、Hash、List、Set、Sorted Set、Redis HyperLogLog

码说芯语的博客 5571

【Redis】贰 —— Redis基本命令

本文对于Redis中的一些命令进行了介绍以及使用案例

2401_86777036的博客 3080

Redis:初识Redis

介绍了Redis的基本概念,在软件开发中的定位,以及安装方式

博客网站 https://async-area.com 2058

Linux安装Redis以及Redis三种启动方式

也就是上面我们说的,窗口要一直打开。后台进程启动搞完之后,以后开启redis后,就可以去进行其他操作了(在src目录下 ./redis-server /opt/soft/redis-4.0.6/redis.conf启动redis)。此时Redis服务已经可以成功启动了,但是小问题来了,界面一直停留在Redis服务窗口中,按ctrl+c虽然可以屏蔽服务窗口,但是也会结束Redis服务。./redis-server代表要启动redis,后面一串代码进入redis.conf来开启redis,就是路径。

m0_74825466的博客 3810

[redis系列] redis脚本

Redis Lua 脚本功能使得用户能够在 Redis 服务器端执行自定义的 Lua 脚本,从而实现更高效、更灵活的数据操作。Lua 脚本运行在 Redis 服务器内部,这意味着你可以减少客户端与服务器之间的通信开销,并且可以通过原子操作确保多个 Redis 命令的执行一致性。组合功能:Lua 脚本能够将 Redis 中的简单命令组合起来,从而实现复杂的业务需求,避免多次网络往返。数据操作原子性:通过 Lua 脚本,开发者可以在 Redis 中执行应用程序逻辑,对多个键进行条件更新。

深耕后端、偏爱架构,用代码与设计构建可靠系统 1675

Redis重大版本整理(Redis2.6-Redis7.0)

Redis借鉴了Linux操做系统对于版本号的命名规则:node 版本号第二位若是是奇数,则为非稳定版本(例如2.7、2.9、3.1),若是是偶数,则为稳定版本(例如2.6、2.8、3.0、3.2)。 当前奇数版本就是下一个稳定版本的开发版本,例如2.9版本是3.0版本的开发版本,因此咱们在生产环境一般选取偶数版本的Redis。 下面是重大版本新功能的归纳: Redis6.0 多线程 IO(Threaded I/O) 众多新模块(modules)API 更好的过期循环(expire cycle) 支持SS

耕云者~ 1万+
上一篇: 深入理解JVM三:虚拟机执行子系统
下一篇: 为什么使用超算中心服务器单节点多GPU训练反而更慢
张小飘
博客等级 码龄11年 9粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值