【Redis】:初识Redis
1.1 盛赞 Redis
Redis 是⼀种基于键值对(key-value)的 NoSQL 数据库,与很多键值对数据库不同的是,Redis
中的值可以是由 string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、
Bitmaps(位图)、HyperLogLog、GEO(地理信息定位)等多种数据结构和算法组成,因此 Redis
可以满⾜很多的应⽤场景,⽽且因为 Redis 会将所有数据都存放再内存中,所以它的读写性能⾮常惊
⼈。不仅如此,Redis 还可以将内存的数据利⽤快照和⽇志的形式保存到硬盘上,这样在发⽣类似断电
或者机器故障的时候,内存中的数据不会“丢失”。除了上述功能以外,Redis 还提供了键过期、发布
订阅、事务、流⽔线、Lua 脚本等附加功能。总之,如果在合适的场景使⽤号 Redis,它就会像⼀把瑞⼠军⼑⼀样所向披靡。
2008 年,Redis 的作者 Salvatore Sanfilippo 在开发⼀个叫 LLOOGG 的⽹站时,需要实现⼀个⾼
性能的队列功能,最开始是使⽤ MySQL 来实现的,但后来发现⽆论怎么优化 SQL 语句等都不能使⽹
站的性能提⾼上去,再加上⾃⼰囊中羞涩,于是他决定⾃⼰做⼀个专属于 LLOOGG 的数据库,这个就
是 Redis 的前⾝。后来,Salvatore Sanfilippo 将 Redis 1.0 的源码发布到 Github 上,可能连他⾃⼰都没想到,Redis 后来如此受欢迎。假如现在有⼈问 Redis 的作者都有谁在使⽤ Redis,我想他可以开句玩笑的回答:还有谁不使⽤
Redis,当然这只是开玩笑,但是从 Redis 的官⽅公司统计来看,有很多重量级的公司都在使⽤
Redis,如国外的 Twitter、Instagram、Stack Overflow、Github 等,国内就更多了,如果单单从体
量来统计,新浪微博可以说是全球最⼤的 Redis 使⽤者,除了新浪微博,还有像阿⾥巴巴、腾讯、搜
狐、优酷⼟⾖、美团、⼩⽶、唯品会等公司都是 Redis 的使⽤者。除此之外,许多开源技术像 ELK 等
已经把 Redis 作为它们组件中的重要⼀环,⽽且 Redis 还提供了模块系统让第三⽅⼈员实现功能扩展,让 Redis 发挥出更⼤的威⼒。所以,可以这么说,熟练使⽤和运维 Redis 已经成为开发运维⼈员的⼀个必备技能。
1.2 Redis 特性
Redis 之所以受到如此多公司的⻘睐,必然有之过⼈之处,下⾯是关于 Redis 的 8 个重要特性。
- 速度快
正常情况下,Redis 执⾏命令的速度⾮常快,官⽅给出的数字是读写性能可以达到 10 万 / 秒,当
然这也取决于机器的性能,但这⾥先不讨论机器性能上的差异,只分析⼀下是什么造就了 Redis 如此
之快,可以⼤概归纳为以下四点:
• Redis 的所有数据都是存放在内存中的,表 1-1 是⾕歌公司 2009 年给出的各层级硬件执⾏速度,所以把数据放在内存中是 Redis 速度快的最主要原因。
• Redis 是⽤ C 语⾔实现的,⼀般来说 C 语⾔实现的程序 “距离” 操作系统更近,执⾏速度相对会更快。
• Redis 使⽤了单线程,预防了多线程可能产⽣的竞争问题。
Redis 在 6.0 版本引⼊了多线程机制,但主要也是在处理⽹络和 IO,不涉及到数据命令,即命令的执⾏仍然采⽤了单线程模式。
• 作者对于 Redis 源代码可以说是精打细磨,曾经有⼈评价 Redis 是少有的集性能和优雅于⼀⾝的开源代码。
表 1-1 ⾕歌公司给出的各层级硬件执⾏速度
2. 基于键值对的数据结构服务器
⼏乎所有的编程语⾔都提供了类似字典的功能,例如 C++ ⾥的 map、Java ⾥的 map、Python ⾥
的 dict 等,类似于这种组织数据的⽅式叫做基于键值对的⽅式,与很多键值对数据库不同的是,
Redis 中的值不仅可以是字符串,⽽且还可以是具体的数据结构,这样不仅能便于在许多应⽤场景的开
发,同时也能提⾼开发效率。Redis 的全程是 REmote Dictionary Server,它主要提供了 5 种数据结
构:字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(ordered set /
zet),同时在字符串的基础之上演变出了位图(Bitmaps)和 HyperLogLog 两种神奇的 ”数据结
构“,并且随着 LBS(Location Based Service,基于位置服务)的不断发展,Redis 3.2. 版本种加⼊
有关 GEO(地理信息定位)的功能,总之在这些数据结构的帮助下,开发者可以开发出各种 “有意
思” 的应⽤。
3. 丰富的功能
除了 5 种数据结构,Redis 还提供了许多额外的功能:
• 提供了键过期功能,可以⽤来实现缓存。
• 提供了发布订阅功能,可以⽤来实现消息系统。
• ⽀持 Lua 脚本功能,可以利⽤ Lua 创造出新的 Redis 命令。
• 提供了简单的事务功能,能在⼀定程度上保证事务特性。
• 提供了流⽔线(Pipeline)功能,这样客⼾端能将⼀批命令⼀次性传到 Redis,减少了⽹络的开
销。
4. 简单稳定
Redis 的简单主要表现在三个⽅⾯。⾸先,Redis 的源码很少,早期版本的代码只有 2 万⾏左右,
3.0 版本以后由于添加了集群特性,代码增⾄ 5 万⾏左右,相对于很多 NoSQL 数据库来说代码量相对
要少很多,也就意味着普通的开发和运维⼈员完全可以 “吃透” 它。其次,Redis 使⽤单线程模型,
这样不仅使得 Redis 服务端处理模型变得简单,⽽且也使得客⼾端开发变得简单。最后,Redis 不需要
依赖于操作系统中的类库(例如 Memcache 需要依赖 libevent 这样的系统类库),Redis ⾃⼰实现了
事件处理的相关功能。
但与简单相对的是 Redis 具备相当的稳定性,在⼤量使⽤过程中,很少出现因为 Redis ⾃⾝ BUG
⽽导致宕掉的情况。
5. 客⼾端语⾔多
Redis 提供了简单的 TCP 通信协议,很多编程语⾔可以很⽅便地接⼊到 Redis,并且由于 Redis 受
到社区和各⼤公司的⼴泛认可,所以⽀持 Redis 的客⼾端语⾔也⾮常多,⼏乎涵盖了主流的编程语
⾔,例如 C、C++、Java、PHP、Python、NodeJS 等,后续我们会对 Redis 的客⼾端使⽤做详细说
明。
6. 持久化(Persistence)
通常看,将数据放在内存中是不安全的,⼀旦发⽣断电或者机器故障,重要的数据可能就会丢
失,因此 Redis 提供了两种持久化⽅式:RDB 和 AOF,即可以⽤两种策略将内存的数据保存到硬盘中
(如图 1-1 所⽰),这样就保证了数据的可持久性,后续我们将对 Redis 的持久化进⾏详细说明。
. 主从复制(Replication)
Redis 提供了复制功能,实现了多个相同数据的 Redis 副本(Replica)(如图 1- 2 所⽰),复制
功能是分布式 Redis 的基础。后续我们会对 Redis 的复制功能进⾏详细演⽰。
7. ⾼可⽤(High Availability)和分布式(Distributed)
Redis 提供了⾼可⽤实现的 Redis 哨兵(Redis Sentinel),能够保证 Redis 结点的故障发现和故
障⾃动转移。也提供了 Redis 集群(Redis Cluster),是真正的分布式实现,提供了⾼可⽤、读写和
容量的扩展性。
1.3 Redis 使⽤场景
上节我们已经了解了 Redis 的若⼲个特性,本节来看⼀下 Redis 的典型应⽤场景有哪些?
1.3.1 Redis 可以做什么
要充分理解 Redis 的作⽤,需要读者对⽹站的架构有⼀定的基础理解,考虑到部分读者缺少这⽅
⾯的背景知识,建议先移步为⼤家准备的 《服务端⾼并发分布式结构演进之路》篇对该领域的基础知
识做⼀定学习后,再度继续本篇的学习。
8. 缓存(Cache)
9. 缓存机制⼏乎在所有⼤型⽹站都有使⽤,合理地使⽤缓存不仅可以加速数据的访问速度,⽽且能
够有效地降低后端数据源的压⼒。Redis 提供了键值过期时间设置,并且也提供了灵活控制最⼤内存和
内存溢出后的淘汰策略。可以这么说,⼀个合理的缓存设计能够为⼀个⽹站的稳定保驾护航。
10. 排⾏榜系统
排⾏榜系统⼏乎存在于所有的⽹站,例如按照热度排名的排⾏榜,按照发布时间的排⾏榜,按照
各种复杂维度计算出的排⾏榜,Redis 提供了列表和有序集合的结构,合理地使⽤这些数据结构可以很
⽅便地构建各种排⾏榜系统。
11. 计数器应⽤
计数器在⽹站中的作⽤⾄关重要,例如视频⽹站有播放数、电商⽹站有浏览数,为了保证数据的
实时性,每⼀次播放和浏览都要做加 1 的操作,如果并发量很⼤对于传统关系型数据的性能是⼀种挑
战。Redis 天然⽀持计数功能⽽且计数的性能也⾮常好,可以说是计数器系统的重要选择。
12. 社交⽹络
赞 / 踩、粉丝、共同好友 / 喜好、推送、下拉刷新等是社交⽹站的必备功能,由于社交⽹站访问量
通常⽐较⼤,⽽且传统的关系型数据不太合适保存这种类型的数据,Redis 提供的数据结构可以相对⽐
较容易地实现这些功能。
13. 消息队列系统
消息队列系统可以说是⼀个⼤型⽹站的必备基础组件,因为其具有业务解耦、⾮实时业务削峰等
特性。Redis 提供了发布订阅功能和阻塞队列的功能,虽然和专业的消息队列⽐还不够⾜够强⼤,但是
对于⼀般的消息队列功能基本可以满⾜
1.3.2 Redis 不可以做什么
实际上和任何⼀⻔技术⼀样,每个技术都有⾃⼰的应⽤场景和边界,也就是说 Redis 并不是万⾦
油,有很多合适它解决的问题,但是也有很多不合适它解决的问题。我们可以站在数据规模和数据冷
热的⻆度来进⾏分析。
站在数据规模的⻆度看,数据可以分为⼤规模数据和⼩规模数据,我们知道 Redis 的数据是存放
在内存中的,虽然现在内存已经⾜够便宜,但是如果数据量⾮常⼤,例如每天有⼏亿的⽤⼾⾏为数
据,使⽤ Redis 来存储的话,基本上是个⽆底洞,经济成本相当⾼。
站在数据冷热的⻆度,数据分为热数据和冷数据,热数据通常是指需要频繁操作的数据,反之为
冷数据,例如对于视频⽹站来说,视频基本信息基本上在各个业务线都是经常要操作的数据,⽽⽤⼾
的观看记录不⼀定是经常需要访问的数据,这⾥暂且不讨论两者数据规模的差异,单纯站在数据冷热
的⻆度上看,视频信息属于热数据,⽤⼾观看记录属于冷数据。如果将这些冷数据放在 Redis 上,基
本上是对于内存的⼀种浪费,但是对于⼀些热数据可以放在 Redis 中加速读写,也可以减轻后端存储
的负载,可以说是事半功倍
所以,Redis 并不是万⾦油,相信随着我们对 Redis 的逐步学习,能够清楚 Redis 真正的使⽤场
景。
1.4 Redis 重⼤版本
Redis 借鉴了 Linux 操作系统对于版本号的命名规则:版本号第⼆位如果是奇数,则为⾮稳定版本
(例如 2.7、2.9、3.1),如果是偶数,则为稳定版本(例如 2.6、2.8、3.0、3.2)。当前奇数版本就
是下⼀个稳定版本的开发版本,例如 2.9 版本是 3.0 版本的开发版本。所以我们⽣产环境通常选取偶数
版本的 Redis,如果对于某些新的特性想提前了解和使⽤,可以选择最新的奇数版本。⽬前最新的版本
是 7.0 版本。本⼩节将对 Redis 发展过程中的⼀些重要版本及特性进⾏说明。
14. Redis 2.6
Redis 2.6 在 2012 年正式发布,相⽐于 Redis 2.4,主要特性如下:
◦ 服务端⽀持 Lua 脚本
◦ 去掉虚拟内存相关功能。
◦ 放开对客⼾端连接数的硬编码限制。
◦ 键的过期时间⽀持毫秒。
◦ 从结点提供只读功能。
◦ 两个新的位图命令:bitcount 和 bitop。
◦ 增强了 redis-benchmark 的功能:⽀持定制化的压测、CSV 格式输出等功能。
◦ 基于浮点数⾃增命令:incrbyfloat 和 hincrbyfloat。
◦ redis-cli 可以使⽤ --eval 参数实现 Lua 脚本执⾏。
◦ shutdown 命令增强。
◦ Info 可以按照 setction 输出,并且添加了⼀些统计项。
◦ 重构了⼤量的核⼼代码,所i有集群相关的代码都去掉了,会在 3.0 ⽀持 cluster 功能。
◦ sort 命令优化。
15. Redis 2.8
Redis 2.8 在 2013 年正式发布,相⽐于 Redis 2.6,主要特性如下:
◦ 添加部分主从复制的功能,在⼀定程度上降低了由于⽹络问题,造成频繁全量复制⽣成 RDB 对
系统造成的压⼒。
◦ 尝试性地⽀持 IPv6。
◦ 可以通过 config set 命令设置 maxclients。
可以⽤ bind 命令绑定多个 IP 地址。
◦ Redis 设置了明显的进程名,⽅便使⽤ ps 命令查看系统进程。
◦ config rewrite 命令可以将 config set 持久化到 Redis 配置⽂件中。
◦ 发布订阅添加了 pubsub 命令。
◦ Redis Sentinel 第⼆版,相⽐于 Redis 2.6 的 Redis Sentinel,此版本已经变成⽣产可⽤。
Redis 3.0
Redis 3.0 在 2015 年正式发布,相⽐于 Redis 2.8,主要特性如下:
◦ Redis Cluster:Redis 提供的官⽅分布式实现。
◦ 全新的 embedded string 对象编码结果,优化了⼩对象内存访问,在特定的⼯作负载时,下载
速度⼤幅提⾼。
◦ 优化了 LRU 算法,⼤幅提供性能。
◦ migrate 链接缓存,⼤幅提供键迁移的速度。
◦ migrate 命令新增两个参数:copy 和 replace。
◦ client pause 命令,在指定时间内中⽌处理客⼾端请求。
◦ bitcount 命令性能提⾼。
◦ config set 设置 maxmemory 时候能够设置不⼀样的单位(以前只能是字节)。
◦ Redis⽇志⼩作调整:⽇志中会反应当前实例的⻆⾊(master 或者 slave)。
◦ incr命令性能提⾼。
16. Redis 3.2
Redis 3.2 在 2016 年正式发布,相⽐于 Redis 3.0,主要特性如下:
◦ 添加 GEO 相关功能。
◦ SDS 在速度和节省空间上都作了优化。
◦ ⽀持⽤ upstart 或者 systemd 管理 Redis 进程。
◦ 新的 List 编码类型:quicklist。
◦ 从节点读取过时数据保证⼀致性。
◦ 添加了 hstrlen 命令。
◦ 加强了 debug 命令,⽀持了更多的参数。
◦ Lua 脚本功能加强。
添加了 Lua Debugger。
◦ config set ⽀持更多的配置参数。
◦ 优化了 Redis 崩溃后的相关报告。
◦ 新的 RDB 格式,可是仍然兼容旧的 RDB。
◦ 加速 RDB 的加载速度。
◦ spop 命令⽀持个数参数。
◦ cluster nodes 命令获得加速。
◦ Jemalloc 更新到 4.0.3 版本。
17. Redis 4.0
Redis 4.0 在 2017 年正式发布,相⽐于 Redis 3.2,主要特性如下:
◦ 提供了模块系统(module),⽅便第三⽅开发者拓展 Redis 的功能。
◦ PSYNC 2.0:优化了以前版本中,主从节点切换必然引发全量复制的问题。
◦ 提供了新的缓存剔除算法:LFU(Last Frequently Used),注意 LFU 和 LRU 算法的不同之
处,LRU 的淘汰规则是基于访问时间,⽽ LFU 是基于访问次数的,并对已有算法进⾏了优化。
◦ 提供了⾮阻塞 del 和 flushall / flushdb 功能,新添加了 unlink 命令, 这个命令是 del 命令的异
步版本, 它可以将删除指定键的操作放在后台线程⾥⾯执⾏。
◦ 提供了 memory 命令,实现对内存更为全⾯的监控统计。
◦ 提供了交互数据库功能,实现 Redis 内部数据库的数据置换。
◦ 提供了 RDB-AOF 混合持久化格式,充分利⽤了 AOF 和 RDB 各⾃优点。
◦ Redis Cluster 兼容 NAT 和 docker 。
18. Redis 5.0
Redis 5.0 在 2018 年正式发布,相⽐于 Redis 4.0,主要特性如下:
◦ 新的流数据类型(stream)。
◦ 新的 Redis 模块 API:定时器、集群和字典 API。
◦ RDB 现在可存储 LFU 和 LRU 信息。
◦ redis-cli 中的集群管理器从 Ruby(redis-trib.rb)移植到了 C 语⾔代码。执⾏ redis-cli -- cluster help
命令以了解更多信息。
◦ 新的有序集合(sorted set)命令:zpopmin / zpopmax 和阻塞变体(blocking variants)。
◦ 升级 Active defragmentation ⾄ v2 版本。
增强 HyperLogLog 的实现。
◦ 更好的内存统计报告。
◦ 许多包含⼦命令的命令现在都有⼀个 help ⼦命令。
◦ 客⼾端频繁连接和断开连接时,性能表现更好。
◦ 许多错误修复和其他⽅⾯的改进。
◦ 升级 Jemalloc ⾄ 5.1 版本。
◦ 引⼊ client unblock 和 client id。
◦ 新增 lolwut 命令。
◦ 在不存在需要保持向后兼容性的地⽅,弃⽤ “slave” 术语。
◦ ⽹络层中的差异优化。
◦ 增强对 Lua 的⽀持:将 Lua 脚本更好地传播到 replicas / AOF、Lua 脚本现在可以超时并在副
本中进⼊ -BUSY 状态。
◦ 引⼊动态的 HZ(Dynamic HZ)以平衡空闲 CPU 使⽤率和响应性。
◦ 对 Redis 核⼼代码进⾏了重构并在许多⽅⾯进⾏了改进。
19. Redis 6.0
Redis 6.0 在 2020 年正式发布,相⽐于 Redis 5.0,主要特性如下:
◦ Redis 6.0 引⼊多线程 IO,但多线程部分只是⽤来处理⽹络数据的读写和协议解析,执⾏命令仍
然是单线程。
◦ 实现了client-side-caching(客⼾端缓存)功能。放弃了caching slot,⽽只使⽤ key names。
◦ Redis 6.0 开始在兼容 RESP 2 的基础上,开始⽀持 RESP 3(RESP,Redis Serialization
Protocol 是 Redis 服务端与客⼾端之间通信的协议)。
◦ 连接⽀持 SSL,更加安全。
◦ 增强 ACL 权限控制:⽀持对客⼾端的权限控制,实现对不同的 key 授予不同的操作权限、新增
⼀个新的ACL ⽇志命令,允许查看所有违反 ACL 的客⼾机、访问不应该访问的命令、访问不应
该访问的密钥,或者验证尝试失败。这对于调试 ACL 问题⾮常有⽤。
◦ 提升了RDB⽇志加载速度。
◦ 发布官⽅的 Redis 集群代理模块 Redis Cluster Proxy。
◦ 提供了众多的新模块(modules)API。
20. Redis 7.0
21.Redis 7.0 在 2022 年正式发布,相⽐于 Redis 6.0,主要特性如下:
◦ 将 AOF ⽂件的存储⽅式改为在⼀个⽂件夹下存储多个⽂件。
◦ 将持久化⽂件 RDB 的版本升级为 10,与之前的 RDB ⽂件版本不再兼容。
◦ 在读取⽼的 RDB ⽂件格式的时候将 ziplist 转换为 listpack,这种转换发⽣于两种情况之下:从
磁盘读取⽂件或者从⼀个主节点进⾏复制⽂件的时候。
◦ 在 redis.conf 配置⽂件中,protected-mode 默认更改为 yes,只有当你希望你的客⼾端在没有
授权的情况下可以连接到 Redis server 的时候可以将 protected-mode 设置为 no。
◦ 在 ACL 中,pub / sub channel 默认是被阻塞的。
◦ 在从节点中,TTL 的时间标识的是绝对时间,不再是相对时间,从⽽保证了过期数据被及时删
除。
◦ 不再⽀持 gopher 协议。
◦ 当在配置⽂件中设置 replica-serve-stale-data=no, 当主节点不再提供服务时,ping 命令得不
到返回值。
1.5 安装并启动 Redis
上⼀节,我们⼤致了解了 Redis 的⼏个重⼤版本,我们在本教程中选择 5.0 版本,原因是 5.0 已经
⽀持了⼤部分的功能特性,⽽且相⽐较于 7.0 版本,更容易进⾏安装使⽤。
Redis 的官⽅并不⽀持微软的 Windows 操作系统,因为 Redis 的许多特性都是和操作系统相
关的,所以⽀持 Windows 会增加维护成本,⽽且更重要的是⼤部分公司都在使⽤ Linux 操作
系统,⽽ Redis 在 Linux 操作系统上的表现已经得到实践的证明。当然 Redis 作为⼀款优秀
的开源技术,还是吸引到微软公司的注意,微软公司的开源技术组在 Github 上维护了⼀个
Redis 分⽀:https://github.com/MSOpenTech/redis。不过我们还是强烈建议⼤家在 Linux
上使⽤ Redis。
接下来,我们选择在 Linux 上安装 Redis.
在 Ubuntu 20 上安装 Redis
Ubuntu
在 CentOS 8 上安装 Redis
Redis 重要⽂件及作⽤
启动/停⽌命令或脚本
/usr/bin/redis-benchmark
/usr/bin/redis-check-aof -> /usr/bin/redis-server
/usr/bin/redis-check-rdb -> /usr/bin/redis-server
/usr/bin/redis-cli
/usr/bin/redis-sentinel -> /usr/bin/redis-server
/usr/bin/redis-server
/usr/libexec/redis-shutdown
redis-server 是 Redis 服务器程序,其余的⼏个例如:redis-check-aof、redis-check-rdb、redissentinel 也都是 redis-server 的软链接。redis-check-aof 是修复 AOF ⽂件⽤的⼯具,同理 redischeck-rdb 是修复 RDB ⽂件的⼯具,redis-sentinel 是 Redis 哨兵程序。
redis-cli 是在我们学习阶段需要频繁⽤到的⼀个命令⾏客⼾端程序,随后做介绍。
redis-benchmark ⽤于对 Redis 做性能基准测试的⼯具。
redis-shutdown 是⽤于停⽌ Redis 的专⽤脚本
Redis 命令⾏客⼾端
现在我们已经启动了 Redis 服务,下⾯将介绍如何使⽤ redis-cli 连接、操作 Redis 服务。客⼾端
和服务端的交互过程如图 1-3 所⽰。
redis-cli 可以使⽤两种⽅式连接 Redis 服务器。
◦ 第⼀种是交互式⽅式:通过 redis-cli -h { host } -p { port } 的⽅式连接到 Redis 服务,后续所有
的操作都是通过交互
式的⽅式实现,不需要再执⾏ redis-cli 了,例如:
[root@host ~]# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set key hello
OK
127.0.0.1:6379> get key
"hello
第⼆种是命令⽅式:⽤redis-cli -h { host } -p { port } { command } 就可以直接得到命令的返回
结果,例如:
[root@host ~]# redis-cli -h 127.0.0.1 -p 6379 ping
PONG
[root@host ~]# redis-cli -h 127.0.0.1 -p 6379 set key hello
OK
[root@host ~]# redis-cli -h 127.0.0.1 -p 6379 get key
"hello
这⾥有两点要注意:1)由于我们连接的 Redis 服务位于 127.0.0.1,端⼝也使⽤的是默认的 6379
端⼝,所以可以省略 -h { host } -p { port }。2)Redis 是学习 Redis 的重要⼯具,后续的⼤量章节都是
⽤它来做讲解。
有关 redis-cli 提供的更为强⼤的功能将在后续章节做详细介绍。
图 1-3 Redis 客⼾端与服务端的交互过程
本章重点回顾
- Redis 的 8 个特性:速度快、基于键值对的数据结果服务器、功能丰富、简单稳定、客⼾端语⾔
多、持久化、主从复制、⽀持⾼可⽤和分布式。 - Redis 并不是万⾦油,有些场景不适合使⽤ Redis 进⾏开发。
- 开发运维结合以及阅读源码是⽤好 Redis 的重要⽅法。
- 安装启动 Redis。
- 根据需求选择稳定版本的 Redis
相关文章:
【Redis】:初识Redis
1.1 盛赞 Redis Redis 是⼀种基于键值对(key-value)的 NoSQL 数据库,与很多键值对数据库不同的是,Redis 中的值可以是由 string(字符串)、hash(哈希)、list(列表…...
C-5 B样条曲线
C-5 B样条曲线 N i , 0 ( u ) { 1 , u i ≤ u < u i 1 0 , o t h e r s N_{i,0}(u)\left\{\begin{matrix} 1 , \quad u_i\le u <u_{i1} \\0 ,\quad others \qquad \quad\end{matrix}\right. Ni,0(u){1,ui≤u<ui10,others N i , p ( u ) u − u i u i p −…...
python安装
python安装 1.下载2.安装3.验证安装成功 1.下载 (1)下载网址:https://www.python.org/downloads/windows/ 进入后稍等一会,比较慢 (2)选择版本 2.安装 (1)双击或者以管理员身份运…...
游戏引擎学习第65天
回顾我们在模拟区域更改方面的进展 目前我们正在进行游戏的架构调整,目标是建立一个引擎架构。我们正在实施的一个关键变化是引入模拟区域的概念,这样我们可以创建非常大的游戏世界,而这些世界的跨度不必受限于单个浮点变量。 通过这种方式…...
代码随想录算法训练营第十六天-二叉树-513.找树左下角的值
左下角不是以为的左下角,而最后一层最左侧的节点也是就是说一个右叶子节点,也可能是最左下角,当然是在其左侧再无其它同级节点看视频讲解使用的递归与回溯方法,自己是完全想不到的,对这道题解法完全是脑袋空空 #inclu…...
力扣第122题:买卖股票的最佳时机 II
力扣第122题:买卖股票的最佳时机 II - C语言解法 题目描述 给定一个数组 prices,其中 prices[i] 是一支股票第 i 天的价格。你可以多次买入和卖出股票,求能够获得的最大利润。 注意: 你不能同时参与多笔交易(即必须…...
【Spring MVC】第一站:Spring MVC介绍配置基本原理
目录 1.引入 2. Java web的发展史 Model I 和Model II 3. MVC模式 4. Spring MVC配置 5. SpringMVC原理 5.1 SpringMVC中心控制器 6. Maven配置 1.引入 $$ Spring与Spring MVC的区别 SSM 包含三部分: Spring MVCSpringMybatis SSM就是升级版的Servlet。 Servlet…...
密钥登录服务器
1. 生成 SSH 密钥对 如果您还没有生成密钥对,可以使用以下命令生成: ssh-keygen 在 root 用户的家目录中生成了一个 .ssh 的隐藏目录,内含两个密钥文件:id_rsa 为私钥,id_rsa.pub 为公钥。 在提示时,您可…...
Java中StopWatch的使用详解
stopWatch 是org.springframework.util 包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比。 在未使用这个工具类之前,如果我们需要统计某段代码的耗时,我们会这样写: public static void main(String[] args…...
安全运营 -- splunk restapi 最小权限
0x00 背景 最小化权限原则,为每个功能,每个账户分配最小的权限。 0x01 实践 只需要7个 capability: Youll need to add certain capabilities to that user or that userss role(s).[capability::rest_apps_management] * Lets a user edit settings …...
12. 日常算法
1. 主持人调度(一) 题目来源 class Solution { public:bool hostschedule(vector<vector<int>>& schedule) {// write code heresort(schedule.begin(), schedule.end());int start -1, end 0;for (auto & nums : schedule){end…...
运行Zr.Admin项目(后端)
1.下载Zr.Admin代码压缩包 https://codeload.github.com/izhaorui/Zr.Admin.NET/zip/refs/heads/main 2.打开项目 我这里装的是VS2022社区版 进入根目录,双击ZRAdmin.sln打开项目 3.安装.net7运行时 我当时下载的代码版本是.net7的 点击安装 点击安装࿰…...
CSS(二):美化网页元素
目录 字体样式 文本样式 列表样式 背景图片 字体样式 字体相关的 CSS 属性: font-family:设置字体font-size:设置字体大小font-weight:设置字体的粗细(如 normal, bold, lighter 等)color:…...
如何不让场景UI受后处理影响
1)如何不让场景UI受后处理影响 2)Sprite打入SpriteAtlasv2依赖丢失 3)如何为Render Texture模式的videoPlayer生成封面 4)如何排查Shader变体的SRP Batcher兼容性 这是第415篇UWA技术知识分享的推送,精选了UWA社区的热…...
【教程】通过Docker运行AnythingLLM
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 官方教程:Local Docker Installation ~ AnythingLLM 1、先创建一个目录用于保存anythingllm的持久化文件: sudo mkdir /app su…...
2024/12/29 黄冈师范学院计算机学院网络工程《路由期末复习作业一》
一、选择题 1.某公司为其一些远程小站点预留了网段 172.29.100.0/26,每一个站点有10个IP设备接到网络,下面那个VLSM掩码能够为该需求提供最小数量的主机数目 ( ) A./27 B./28 C./29 D./30 -首先审题我们需要搞清楚站点与网…...
LeetCode-整数反转(007)
一.题目描述 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。 假设环境不允许存储 64 位整数(有符号或无符号)。 二.示例 …...
碰一碰发视频矩阵系统源码搭建,支持OEM
一、引言 随着短视频的火爆发展,碰一碰发视频的矩阵系统逐渐受到关注。这种系统能够实现用户通过碰一碰设备(如 NFC 标签)快速触发视频的发布,在营销推广、互动体验等领域有着广泛的应用前景。本文将详细介绍碰一碰发视频矩阵系统…...
Linux网络编程3——多线程编程(改良版)
一.多线程 1.什么是线程 要了解线程,首先需要知道进程。一个进程指的是一个正在执行的应用程序。线程对应的英文名称为“thread”,它的功能是执行应用程序中的某个具体任务,比如一段程序、一个函数等。 线程和进程之间的关系,类…...
LeetCode每日三题(六)数组
一、最大子数组和 自己答案: class Solution {public int maxSubArray(int[] nums) {int begin0;int end0;if(numsnull){//如果数组非空return 0;}else if(nums.length1){//如果数组只有一个元素return nums[0];}//初值选为数组的第一个值int resultnums[0];int i…...
安装了python,环境变量也设置了,但是输入python不报错也没反应是为什么?window的锅!
目录 问题 结论总结 衍生问题 1 第1步:小白python安装,不要埋头一直点下一步!!! 2 第2步:可以选择删了之前的,重新安装python 3 第3步:如果你不想或不能删了重装python&#…...
Vue.js组件开发-使用KeepAlive缓存特定组件
在Vue中,<keep-alive> 组件是一个非常有用的工具,可以用来缓存那些不希望每次切换时都重新渲染的组件。要缓存特定组件,可以使用 <keep-alive> 的 include 和 exclude 属性,这两个属性都接受字符串、正则表达式或数组…...
配置hive支持中文注释
hive元数据metastore默认的字符集是latin1,所以中文注释会乱码。但是不能将metastore库的字符集更改为utf-8,只能对特定表、特定列修改为utf-8。配置hive支持中文注释,主要在两个方面: 1、在Hive元数据存储的Mysql数据库中&#…...
Windows配置IE浏览器不自动跳转到Edge
一:使用 IE 浏览器自身设置(部分情况有效) 打开 IE 浏览器设置:启动 IE 浏览器,点击右上角的 “工具”(齿轮形状)图标,选择 “Internet 选项”。设置启动选项:在 “Inte…...
BGP特性实验
实验拓扑 实验需求及解法 本实验模拟大规模BGP网络部署,使用4字节AS号,传递IPv6路由。 预配说明: sysname R1 ospfv3 1router-id 1.1.1.1 # firewall zone Localpriority 15 # interface Serial1/0/0link-protocol pppipv6 enable ipv6 ad…...
【多模态】从零学习多模态——2024学习笔记总结
从零学习多模态——2024学习笔记总结 前言1. preliminary2. Transformer和NLP基础3. 多模态模型原理和架构学习4. 动手实验多模态模型第一步尝试Swift框架使用数据验证 5. 总结 前言 2024快结束啦,半年抽空学了学多模态还挺好玩的,学习和踩坑记录记一下&…...
Meta AI 提出大型概念模型(LCMs):语义超越基于令牌的语言建模
在自然语言处理(Natural Language Processing, NLP)的领域,大型语言模型(Large Language Models, LLMs)已经取得了令人瞩目的成就,它们使得文本生成、摘要和问答等应用成为现实。但是,这些模型依…...
【优先算法】滑动窗口 --(结合例题讲解解题思路)(C++)
目录 编辑 1.什么是滑动窗口? 2. 滑动窗口例题 2.1 例题1:长度最小的子数组 2.1.1 解题思路 2.1.2 方法一:暴力枚举出所有的子数组的和 2.1.3 方法二:使用 “同向双指针” 也就是滑动窗口来进行优化 2.2 例题2:无重…...
Linux下PostgreSQL-12.0安装部署详细步骤
一、安装环境 postgresql-12.0 CentOS-7.6 注意:确认linux系统可以正常连接网络,因为在后面需要添加依赖包。 二、pg数据库安装包下载 下载地址:PostgreSQL: File Browser 选择要安装的版本进行下载: 三、安装依赖包 在要安…...
Delphi历史版本对照及主要版本特性
Delphi编程的关键特性包括: 可视化开发:Delphi以其独特的开发方法而闻名,它允许开发者通过直观的表单设计器来创建用户界面。这种快速应用程序开发(RAD)的方法大大简化并加速了图形用户界面(GUI)…...
java基础知识22 java的反射机制
一 java反射机制 1.1 概述 Java反射,程序在运行时,动态获取类信息(类元数据),获取字段属性,动态创建对象和调用方法。Spring框架正是基于反射机制,通过我们的配置文件,在项目运行时…...
多因子模型连载
多因子模型 (Multi-Factor Model)是量化投资中的一种重要工具,用于解释和预测股票收益。它通过将多个不同的因子(如市值、动量、价值、质量等)结合起来,构建一个综合的模型来评估股票的表现。多因子模型不仅能够捕捉单个因子的影响…...
服务器广播算法
服务器广播算法(Server Broadcasting Algorithm)是一种在分布式系统中用于高效地将信息从一个服务器传播到整个网络的算法。它被广泛用于分布式计算、数据中心、内容分发网络(CDN)和消息队列系统中。以下是常见的服务器广播算法的…...
具身智能 - Vision-language-action models for robot manipulation
具身智能大模型简介_哔哩哔哩_bilibili 受到自然语言处理、计算机视觉领域中基础模型的成功的启发,具身智能领域也在尝试设计、训练、微调大模型来解决现实生活中最普遍存在的机器人操作问题。“Vision-language-action models for robot manipulation”࿰…...
计算机组成原理的学习笔记(12) -- 总线和I/O系统
学习笔记 前言 本文主要是对于b站尚硅谷的计算机组成原理的学习笔记,仅用于学习交流。 总线 1. 组成 总线主要由三种信号线组成: 数据线:用于传输实际的数据,宽度决定了数据传输的并行性。 地址线:传输内存或I/…...
ReactiveStreams、Reactor、SpringWebFlux
注意: 本文内容于 2024-12-28 21:22:12 创建,可能不会在此平台上进行更新。如果您希望查看最新版本或更多相关内容,请访问原文地址:ReactiveStreams、Reactor、SpringWebFlux。感谢您的关注与支持! ReactiveStreams是…...
【潜意识Java】探寻Java子类构造器的神秘面纱与独特魅力,深度学习子类构造器特点
目录 一、子类构造器的诞生背景 (一)为啥要有子类构造器? (二)子类与父类构造器的关系 二、子类构造器的调用规则 (一)默认调用父类无参构造器 (二)显式调用父类构…...
OpenCV调整图像亮度和对比度
【欢迎关注编码小哥,学习更多实用的编程方法和技巧】 1、基本方法---线性变换 // 亮度和对比度调整 cv::Mat adjustBrightnessContrast(const cv::Mat& src, double alpha, int beta) {cv::Mat dst;src.convertTo(dst, -1, alpha, beta);return dst; }// 使用…...
HarmonyOs DevEco studio小技巧40--应用名称、图标与启动动画修改全攻略
一、引言 随着 HarmonyOS 的日益普及,越来越多的开发者投身于这个充满潜力的生态之中。而 DevEco Studio 作为 HarmonyOS 官方推出的集成开发环境,为开发者提供了一站式的开发体验。在应用开发过程中,一些细节上的设置,如应用名称…...
ESP-IDF学习记录(2)ESP-IDF 扩展的简单使用
傻瓜式记录一个示例的打开,编译,运行。后面我再一个个运行简单分析每个demo的内容。 1.打开示例代码 2.选择项目,文件夹 3.选择串口 4.选择调试方式 5.根据硬件GPIO口配置menuconfig 6.构建项目 7.烧录设备,选择串口UART方式 运行…...
2024 年最新 windows 操作系统搭建部署 nginx 服务器应用详细教程(更新中)
nginx 服务器概述 Nginx 是一款高性能的 HTTP 和 反向代理 服务器,同时是一个 IMAP / POP3 / SMTP 代理服务器。Nginx 凭借其高性能、稳定性、丰富的功能集、简单的配置和低资源消耗而闻名。 浏览 nginx 官网:https://nginx.org/ Nginx 应用场景 静态…...
基于ArcGIS Pro的SWAT模型在流域水循环、水生态模拟中的应用及案例分析;SWAT模型安装、运行到结果读取全流程指导
目前,流域水资源和水生态问题逐渐成为制约社会经济和环境可持续发展的重要因素。SWAT模型是一种基于物理机制的分布式流域水文与生态模拟模型,能够对流域的水循环过程、污染物迁移等过程进行精细模拟和量化分析。SWAT模型目前广泛应用于流域水文过程研究…...
Quartz任务调度框架实现任务动态执行
说明:之前使用Quartz,都是写好Job,指定一个时间点,到点执行。最近有个需求,需要根据前端用户设置的时间点去执行,也就是说任务执行的时间点是动态变化的。本文介绍如何用Quartz任务调度框架实现任务动态执行…...
10.MySQL事务
目录 什么是事务为什么有事务存在事务的版本支持事务的提交方式事务常见的操作方式事务异常验证与产出结论事务隔离性理论事务隔离级别的设置与查看事务隔离级别 - 读未提交事务隔离级别 - 读提交事务隔离级别 - 可重复读事务隔离级别 - 串行化MVCC机制3个记录隐藏字段undo日志…...
1.若依介绍
若依框架 好处: 1.快速构建 2.通用模块(登录、权限分配和校验、操作日志功能) 3.代码生成(定义好数据库表的结构,就能自动生成前后端对应的代码) 位置:系统工具-> 代码生成 若依版本 R…...
计算机网络实验室建设方案
一、计算机网络实验室拓扑结构 计算机网络综合实验室解决方案,是面向高校网络相关专业开展教学实训的综合实训基地解决方案。教学实训系统采用 B/S架构,通过公有云教学实训平台在线学习模式,轻松实现网络系统建设与运维技术的教学…...
【Rust自学】6.4. 简单的控制流-if let
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 6.4.1. 什么是if let if let语法允许将if和let组合成一种不太冗长的方式来处理与一种模式匹配的值,同时忽略其余模式。 可以…...
4-1 输出一组成绩中的最高分和最低分
第一行输入人数n,第二行输入每个人的成绩,用空格分开。输出所有成绩中的最高分和最低分。 输入格式: 第一行输入n,大于0的整数;第二行输入n个大于等于0,小于等于100的整数,用空格分开。 输出格式: 最高…...
数据结构:二叉树部分接口(链式)
目录 二叉树的遍历 1.通过前序遍历的数据构造二叉树 2.二叉树销毁 3. 二叉树节点个数 4. 二叉树叶子节点的个数 5.二叉树第k层节点个数 6.二叉树查找值为x的节点 7.二叉树的前/中/后序遍历 8.层序遍历 9.判断二叉树是否是完全二叉树 二叉树的遍历 前序、中序以及后序…...
音视频入门基础:MPEG2-PS专题(1)——MPEG2-PS官方文档下载
一、引言 MPEG2-PS(又称PS,Program Stream,程序流,节目流)是一种多路复用数字音频、视频等的封装容器。MPEG2-PS将一个或多个分组但有共同的时间基准的基本数据流 (PES)合并成一个整体流。它是…...