网站你应该明白我的意思就是当算法拥有了“读心术”,交互才叫真正的智能

核心内容摘要

共同的起点:重塑连接,点亮未来
尘封的时光:丈夫遗像前的中字,诉说着不曾褪色的爱

揭秘“x7x7x7x7x7任意槽版”:不止于想象,更在于重塑!

Redis的基本概念Redis 官网Redis - The Real-time Data PlatformRedis 是一种基于键值对key-value的 NoSQL 数据库。

与很多键值对数据库不同的是Redis 中的 key 都是 string字符串值value可以是由 string字符串、hash哈希、list列表、set集合、zset有序集合、Bitmaps位图、HyperLogLog、GEO地理信息定位等多种数据结构和算法组成。

因此Redis 可以满足很多的应用场景而且 Redis 会将所有数据都存放在内存中所以它的读写性能非常惊人。

不仅如此Redis 还可以将内存的数据利用快照和日志的形式保存到硬盘上这样在发生类似断电或者机器故障的时候内存中的数据不会 “丢失”。

除了上述功能以外Redis 还提供了键过期、发布订阅、事务、流水线、Lua 脚本等附加功能。

了解2008 年Redis 的作者 Salvatore SanfilippoList of posts - antirez 在开发⼀个叫 LLOOGG 的网站时需要实现⼀个高性能的队列功能最开始是使用 MySQL 来实现的但后来发现无论怎么优化 SQL 语句等都不能使网站的性能提高上去再加上自己囊中羞涩于是他决定自己做⼀个专属于 LLOOGG 的数据库这个就是 Redis 的前身。

后来Salvatore Sanfilippo 将 Redis

0 的源码发布到 Github 上可能连他自己都没想到Redis 后来如此受欢迎。

假如现在有人问 Redis 的作者都有谁在使用 Redis我想他可以开句玩笑的回答还有谁不使用 Redis当然这只是开玩笑但是从 Redis 的官方公司统计来看有很多重量级的公司都在使用 Redis如国外的 Twitter、Instagram、Stack Overflow、Github 等国内就更多了如果单单从体量来统计新浪微博可以说是全球最大的 Redis 使用者除了新浪微博还有像阿里巴巴、腾讯、搜狐、优酷土豆、美团、小米、唯品会等公司都是 Redis 的使用者。

除此之外许多开源技术像 ELK 等已经把 Redis 作为它们组件中的重要一环而且 Redis 还提供了模块系统让第三方人员实现功能扩展让 Redis 发挥出更大的威力。

所以可以这么说熟练使用和运维 Redis 已经成为开发运维人员的一个必备技能。

Redis的特性

1 速度快正常情况下Redis 执行命令的速度非常快相较于 MySQL 这样的关系型数据库官方给出的数字是读写性能可以达到 10 万 / 秒当然这也取决于机器的性能但这里先不讨论机器性能上的差异只分析一下是什么造就了 Redis 如此之快可以大概归纳为以下四点Redis 的所有数据都是存放在内存中的通过一系列的数据结构主要是键值对进行存储下表是谷歌公司 2009 年给出的各层级硬件执行速度所以把数据放在内存中是 Redis 速度快的最主要原因Redis 是用 C 语言实现的一般来说 C 语言实现的程序 “距离” 操作系统更近执行速度相对会更快。

网上绝大部分资料这么说但我不是很赞同因为 MySQL 也是 C 语言开发的Redis 使用了单线程预防了多线程可能产生的竞争问题减少了不必要的线程之间的竞争开销。

Redis 在

0 版本引入了多线程机制但主要也是在处理网络和 IO不涉及到数据命令即命令的执行仍然采用了单线程模式。

对比多线程提高效率的前提CPU 密集型的任务使用多个线程可以充分利用 CPU 多核资源。

但是 Redis 的核心任务是操作内存的数据结构不会吃很多 CPU。

如果此时选择多线程多核资源也用不上因为单个核心的处理速度已经很快了不仅没有明显的提升同时还要考虑线程安全、加锁一旦竞争就会阻塞阻塞又会涉及到什么时候唤醒作者对于 Redis 源代码可以说是精打细磨曾经有人评价 Redis 是少有的集性能和优雅于一身的开源代码。

从网络的角度上Redis 使用了 IO 多路复用的方式epoll也就是使用一个线程管理多个 socket。

2 基于键值对的数据结构服务器几乎所有的编程语言都提供了类似字典的功能例如 C 里的 map、Java 里的 map、Python 里的 dict 等类似于这种组织数据的方式叫做基于键值对的方式。

与很多键值对数据库不同的是Redis 中的值不仅可以是字符串而且还可以是具体的数据结构这样不仅能便于在许多应用场景的开发同时也能提高开发效率。

Redis 的全程是 REmote Dictionary Server它主要提供了 5 种数据结构字符串string、哈希hash、列表list、集合set、有序集合ordered set / zet同时在字符串的基础之上演变出了位图Bitmaps和 HyperLogLog 两种神奇的 “数据结构”并且随着 LBSLocation Based Service基于位置服务的不断发展Redis

3.

版本种加入有关 GEO地理信息定位的功能总之在这些数据结构的帮助下开发者可以开发出各种 “有意思” 的应用。

3 丰富的功能除了 5 种数据结构Redis 还提供了许多额外的功能提供了键过期功能可以用来实现缓存。

提供了发布订阅功能可以用来实现消息系统。

支持 Lua 脚本功能可以利用 Lua 创造出新的 Redis 命令.提供了简单的事务功能能在⼀定程度上保证事务特性。

提供了流水线Pipeline功能这样客户端能将一批命令一次性传到 Redis减少了网络的开销。

4简单稳定Redis 的简单主要表现在三个方面Redis 的源码很少早期版本的代码只有 2 万行左右

0 版本以后由于添加了集群特性代码增至 5 万行左右相对于很多 NoSQL 数据库来说代码量相对要少很多也就意味着普通的开发和运维⼈员完全可以 “吃透” 它。

Redis 使用单线程模型这样不仅使得 Redis 服务端处理模型变得简单而且也使得客户端开发变得简单。

Redis 不需要依赖于操作系统中的类库例如 Memcache 需要依赖 libevent 这样的系统类库Redis 自己实现了事件处理的相关功能。

但与简单相对的是 Redis 具备相当的稳定性在大量使用过程中很少出现因为 Redis 自身 BUG 而导致宕掉的情况。

但与简单相对的是 Redis 具备相当的稳定性在大量使用过程中很少出现因为 Redis 自身 BUG 而导致宕掉的情况。

5 客户端语言多客户端语言多扩展能力ExtensibilityRedis 提供了简单的 TCP 通信协议很多编程语言可以很方便地接入到 Redis并且由于 Redis 受到社区和各大公司的广泛认可所以支持 Redis 的客户端语言也非常多几乎涵盖了主流的编程语言例如C、C、Java、PHP、Python、NodeJS 等后续我会对 Redis 的客户端使用做详细说明。

可以在 Redis 原有的功能基础上再进行扩展Redis 提供了一组 API。

通过 CCRust 这几个语言编写 Redis 扩展本质上就是一个动态链接库让 Redis 支持更多的数据结构以及支持更多的命令。

6 持久化 Persistence为了更快速的访问Redis 把数据存储在内存上。

通常来看将数据放在内存中是不安全的易失一旦发生断电或者机器故障重要的数据可能就会丢失因此Redis 提供了两种持久化方式RDBRedis Database Backup file Redis数据快照AOFAppend Only File 追加文件即我们可以用两种策略将内存的数据保存到硬盘中内存为主、硬盘为辅硬盘相当于对内存中的数据进行了备份这样就保证了数据的可持久性。

如果 Redis 重启那么就会在重启时加载硬盘中的备份数据使 Redis 的内存恢复到重启前的状态。

Redis 内存到硬盘的持久化

7 主从复制 ReplicationRedis 提供了复制功能实现了多个相同数据的 Redis 副本Replica复制功能是分布式 Redis 的基础。

Redis 主从复制架构

8 高可用和分布式高可用High Availability和分布式DistributedRedis 提供了高可用实现的 Redis 哨兵Redis Sentinel能够保证 Redis 结点的故障发现和故障自动转移。

也提供了 Redis 集群Redis Cluster是真正的分布式实现提供了高可用、读写和容量的扩展性。

Redis 自身也是支持 “主从” 结构的从节点就相当于主节点的备份。

9 可编程的和集群可编程的 / 编程能力Programmability针对 Redis 的操作可以直接通过简单的交互式命令进行操作也可以通过一些脚本的方式批量执行一些操作可以带有一些逻辑。

集群ClusteringRedis 作为一个分布式系统的中间件能够支持集群是非常关键的。

这个水平扩展类似于 “分库分表”。

一个 Redis 能够存储的数据是有限的内存空间有限。

如果想存储更多的数据那就需要引入多个主机部署多个 Redis 节点每个 Redis 存储数据的一部分。

Redis的应用

1 缓存和会话缓存Cache 会话Session缓存机制几乎在所有大型网站都有使用合理地使用缓存不仅可以加速数据的访问速度而且能够有效地降低后端数据源的压力。

Redis 提供了键值过期时间设置并且也提供了灵活控制最大内存和内存溢出后的淘汰策略。

可以这么说一个合理的缓存设计能够为一个网站的稳定保驾护航。

在 Linux 的学习中我们知道了 cookie 可以实现用户身份信息的保存只是在浏览器这边存储了用户的身份标识 sessionId同时这是需要 session 配合服务器这时才真正的存储了用户数据。

之前 session 是存储在应用服务器上的现在变成了分布式系统引入了负载均衡如何解决上述问题想办法让负载均衡器把同一个用户的请求始终打到同一个机器上不能再采用轮询了而是要通过 userId 之类的方式来分配机器。

把会话数据单独拎出来放到一组独立的机器上进行存储Redis把应用程序重启了会话也不会丢失就算丢失了大不了让用户重新进行登录。

2 排行榜系统排行榜系统几乎存在于所有的网站例如按照热度排名的排行榜按照发布时间的排行榜按照各种复杂维度计算出的排行榜。

Redis 提供了列表和有序集合的结构合理地使用这些数据结构可以很方便地构建各种排行榜系统

3 计数器应用计数器在网站中的作用至关重要。

例如视频网站有播放数、电商网站有浏览数为了保证数据的实时性每一次播放和浏览都要做加 1 的操作如果并发量很大对于传统关系型数据的性能是一种挑战。

Redis 天然支持计数功能而且计数的性能也非常好可以说是计数器系统的重要选择。

4 社交网络赞 / 踩、粉丝、共同好友 / 喜好、推送、下拉刷新等是社交网站的必备功能由于社交网站访问量通常比较大而且传统的关系型数据不太合适保存这种类型的数据Redis 提供的数据结构可以相对比较容易地实现这些功能。

5 消息队列系统消息队列服务器系统Streaming Messaging消息队列系统可以说是⼀个大型网站的必备基础组件因为其具有业务解耦、非实时业务削峰等特性。

基于这个可以实现一个网络版本的生产者消费者模型。

对于分布式系统来说服务器和服务器之间有时候也需要使用到生产者消费者模型。

优势如下解耦合削峰填谷业界也有很多知名的消息队列例如RabbitMQ、Kafka、RocketMQ...Redis 提供了发布订阅功能和阻塞队列的功能虽然和专业的消息队列比还不够足够强大但是对于一般的消息队列功能基本可以满足。

如果当前场景中对于消息队列的功能以来不是很多并且又不想引入额外的依赖那么 Redis 可以作为一个选择。

6 Redis的应用缺点实际上和任何一门技术⼀样每个技术都有自己的应用场景和边界也就是说 Redis 并不是万金油有很多合适它解决的问题但是也有很多不合适它解决的问题。

我们可以站在数据规模和数据冷热的角度来进行分析。

站在数据规模的角度看数据可以分为大规模数据和小规模数据我们知道 Redis 的数据是存放在内存中的虽然现在内存已经足够便宜但是如果数据量非常大例如每天有几亿的用户行为数据使用 Redis 来存储的话基本上是个无底洞经济成本相当高。

站在数据冷热的角度数据分为热数据和冷数据热数据通常是指需要频繁操作的数据反之为冷数据例如对于视频网站来说视频基本信息基本上在各个业务线都是经常要操作的数据而用户的观看记录不⼀定是经常需要访问的数据。

这里暂且不讨论两者数据规模的差异单纯站在数据冷热的角度上看视频信息属于热数据用户观看记录属于冷数据。

如果将这些冷数据放在 Redis 上基本上是对于内存的⼀种浪费但是对于一些热数据可以放在 Redis 中加速读写也可以减轻后端存储的负载可以说是事半功倍。

将热数据放在 Redis 中存储而将冷数据用 MySQL 来存储。

很多领域都涉及到 “二八原则”20% 的热数据能满足 80% 访问需求。

系统的复杂程度大大提升而且如果数据发生修改还会涉及到 Redis 和 MySQL 之间的数据同步问题。

Redis 重大版本Redis 借鉴了 Linux 操作系统对于版本号的命名规则版本号第二位如果是奇数则为非稳定版本例如

2.

7、

2.

9、

1如果是偶数则为稳定版本例如

2.

6、

2.

8、

3.

0、

2。

当前奇数版本就是下一个稳定版本的开发版本例如

9 版本是

0 版本的开发版本。

所以我们生产环境通常选取偶数版本的 Redis如果对于某些新的特性想提前了解和使用可以选择最新的奇数版本。

Redis

6Redis

6 在 2012 年正式发布相比于 Redis

4主要特性如下服务端支持 Lua 脚本。

去掉虚拟内存相关功能。

放开对客户端连接数的硬编码限制。

键的过期时间支持毫秒。

从结点提供只读功能。

两个新的位图命令bitcount 和 bitop。

增强了 redis-benchmark 的功能支持定制化的压测、CSV 格式输出等功能。

基于浮点数自增命令incrbyfloat 和 hincrbyfloat。

redis-cli 可以使用 --eval 参数实现 Lua 脚本执行。

shutdown 命令增强。

Info 可以按照 setction 输出并且添加了一些统计项。

重构了大量的核心代码所有集群相关的代码都去掉了会在

0 支持 cluster 功能。

sort 命令优化。

Redis

8Redis

8 在 2013 年正式发布相比于 Redis

6主要特性如下添加部分主从复制的功能在⼀定程度上降低了由于网络问题造成频繁全量复制生成 RDB 对系统造成的压力。

尝试性地支持 IPv6。

可以通过 config set 命令设置 maxclients。

可以用 bind 命令绑定多个 IP 地址。

Redis 设置了明显的进程名方便使用 ps 命令查看系统进程。

config rewrite 命令可以将 config set 持久化到 Redis 配置文件中。

发布订阅添加了 pubsub 命令。

Redis Sentinel 第二版相比于 Redis

6 的 Redis Sentinel此版本已经变成生产可用。

Redis

0Redis

0 在 2015 年正式发布相比于 Redis

8主要特性如下Redis ClusterRedis 提供的官方分布式实现。

全新的 embedded string 对象编码结果优化了小对象内存访问在特定的工作负载时下载速度大幅提高。

优化了 LRU 算法大幅提供性能。

migrate 链接缓存大幅提供键迁移的速度。

migrate 命令新增两个参数copy 和 replace。

client pause 命令在指定时间内中止处理客户端请求。

bitcount 命令性能提高。

config set 设置 maxmemory 时候能够设置不⼀样的单位以前只能是字节。

Redis 日志小作调整日志中会反应当前实例的角色master 或者 slave。

incr命令性能提高。

Redis

2Redis

2 在 2016 年正式发布相比于 Redis

0主要特性如下添加 GEO 相关功能。

SDS 在速度和节省空间上都作了优化。

支持用 upstart 或者 systemd 管理 Redis 进程。

新的 List 编码类型quicklist。

从节点读取过时数据保证⼀致性。

添加了 hstrlen 命令。

加强了 debug 命令⽀持了更多的参数。

Lua 脚本功能加强。

添加了 Lua Debugger。

config set 支持更多的配置参数。

优化了 Redis 崩溃后的相关报告。

新的 RDB 格式可是仍然兼容旧的 RDB。

加速 RDB 的加载速度。

spop 命令支持个数参数。

cluster nodes 命令获得加速。

Jemalloc 更新到

4.

3 版本。

Redis

0Redis

0 在 2017 年正式发布相比于 Redis

2主要特性如下提供了模块系统module方便第三方开发者拓展 Redis 的功能。

PSYNC

0优化了以前版本中主从节点切换必然引发全量复制的问题。

提供了新的缓存剔除算法LFULast Frequently Used注意 LFU 和 LRU 算法的不同之处LRU 的淘汰规则是基于访问时间而 LFU 是基于访问次数的并对已有算法进行了优化。

提供了非阻塞 del 和 flushall / flushdb 功能新添加了 unlink 命令 这个命令是 del 命令的异步版本 它可以将删除指定键的操作放在后台线程里面执⾏。

提供了 memory 命令实现对内存更为全面的监控统计。

提供了交互数据库功能实现 Redis 内部数据库的数据置换。

提供了 RDB-AOF 混合持久化格式充分利用了 AOF 和 RDB 各自优点。

Redis Cluster 兼容 NAT 和 docker 。

Redis

0Redis

0 在 2018 年正式发布相比于 Redis

0主要特性如下新的流数据类型stream。

新的 Redis 模块 API定时器、集群和字典 API。

RDB 现在可存储 LFU 和 LRU 信息。

redis-cli 中的集群管理器从 Rubyredis-trib.rb移植到了 C 语言代码。

执行 redis-cli --cluster help 命令以了解更多信息。

新的有序集合sorted set命令zpopmin / zpopmax 和阻塞变体blocking variants。

升级 Active defragmentation 至 v2 版本。

​​​​​​增强 HyperLogLog 的实现。

更好的内存统计报告。

许多包含子命令的命令现在都有一个 help 子命令。

客户端频繁连接和断开连接时性能表现更好。

许多错误修复和其他方面的改进。

升级 Jemalloc 至

1 版本。

引入 client unblock 和 client id。

新增 lolwut 命令。

在不存在需要保持向后兼容性的地方弃用 slave 术语。

网层中的差异优化。

增强对 Lua 的支持将 Lua 脚本更好地传播到 replicas / AOF、Lua 脚本现在可以超时并在副本中进⼊ -BUSY 状态。

引入动态的 HZDynamic HZ以平衡空闲 CPU 使用率和响应性。

对 Redis 核心代码进行了重构并在许多方面进行了改进。

Redis

0Redis

0 在 2020 年正式发布相比于 Redis

0主要特性如下Redis

0 引入多线程 IO但多线程部分只是用来处理网络数据的读写和协议解析执行命令仍然是单线程。

实现了client-side-caching客户端缓存功能。

放弃了caching slot而只使用 key names。

Redis

0 开始在兼容 RESP 2 的基础上开始支持 RESP 3RESPRedis Serialization Protocol 是 Redis 服务端与客户端之间通信的协议。

连接支持 SSL更加安全。

增强 ACL 权限控制支持对客户端的权限控制实现对不同的 key 授予不同的操作权限、新增一个新的 ACL 日志命令允许查看所有违反 ACL 的客户机、访问不应该访问的命令、访问不应该访问的密钥或者验证尝试失败。

这对于调试 ACL 问题非常有用。

提升了 RDB 日志加载速度。

发布官方的 Redis 集群代理模块 Redis Cluster Proxy。

提供了众多的新模块modulesAPI。

Redis

0Redis

0 在 2022 年正式发布相比于 Redis

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-datano当主节点不再提供服务时ping 命令得不到返回值。

Redis在Ubuntu安装和配置下面安装的是Redis

0的版本。

因为

0 已经支持了大部分的功能特性而且相比较于

0 版本更容易进行安装使用。

在Centos安装和Ubuntu安装应该只有下载的命令不一样。

使用 apt 命令安装 redisapt install redis使用 netstat -anp | grep redis 查看可以看到 redis 的默认端口是 6379同时也可以看到IP 这里绑定了本机的 IP ——

127.

0.

1只能当前主机上的客户端可以访问跨主机就访问不了了因此需要手动修改 IP使其它主机能够访问。

手动修改配置文件 修改IPvim /etc/redis/redis.conf找到 bind 把

127.

0.

1改为

0.

0.

0protected-mode yes改为protected-mode noprotected-mode yes ----protected-mode no重新启动服务器修改的配置才生效~ 输入下面命令可以重启service redis-server restart如果没有任何提示说明修改成功没有提示才是最好滴如果有提示可能刚刚修改的配置有问题。

使用下面命令查看service redis-server status使用 redis 自带的客户端连接服务器输入 redis-cli 再输入 ping如果给出 pong即为连通。

最后输入Ctrl d或者exit退出redis客户端即可本篇完。

下一篇是redis的使用。

91抓大雷-91抓大雷应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123