Redis 介绍及安装
Redis(REmote DIctionary Server)是一个开源的使用 ANSI C 编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从名字上看,Redis 的名称来自西班牙的 “红色” 这个词,意味着 “红色灯笼” 或 “红色旗帜”,表示对数据库快速、可扩展、高可靠性的追求。
# Redis 的来历
Redis 的诞生可以追溯到 2009 年,当时 Salvatore Sanfilippo(即 antirez)为了解决自己在使用 Memcached 时遇到的一些问题,开始开发 Redis。Memcached 是一个开源的内存中的数据缓存系统,主要用于减少数据库访问次数,以提高网站的访问速度。然而,Sanfilippo 发现 Memcached 的功能过于简单,无法满足一些复杂的需求,如数据持久化和数据同步等。因此,他决定开发一个全新的数据库,以满足这些需求。
# 为何需要 Redis
随着互联网的发展,数据量不断增长,传统的关系型数据库在处理大量数据时,性能逐渐下降。同时,随着分布式系统的普及,数据一致性和同步问题也变得越来越突出。Redis 的出现,就是为了解决这些问题。
首先,Redis 是内存数据库,读写速度非常快,可以满足高并发、大数据量的处理需求。其次,Redis 支持多种数据结构,包括字符串、哈希、列表、集合和有序集合等,可以满足各种复杂的业务需求。最后,Redis 还提供了丰富的数据操作和事务控制功能,可以保证数据的一致性和可靠性。
# Redis 的功能
- 数据结构:Redis 支持多种数据结构,包括字符串、哈希、列表、集合和有序集合等。这些数据结构可以满足各种复杂的业务需求。
- 数据操作:Redis 提供了丰富的数据操作和事务控制功能,包括增加、删除、修改和查询等操作。同时,Redis 还支持事务控制和乐观锁等机制,可以保证数据的一致性和可靠性。
- 数据持久化:Redis 支持多种数据持久化方式,包括 RDB 和 AOF 等。RDB 通过生成数据快照的方式进行持久化,而 AOF 则通过记录操作日志的方式进行持久化。这两种方式都可以保证数据的可靠性和恢复能力。
- 数据同步:Redis 支持主从复制和集群复制两种方式进行数据同步。主从复制可以实现读写分离和负载均衡等功能,而集群复制则可以实现数据的分布式存储和容灾等功能。
- 分布式锁:Redis 提供了分布式锁功能,可以在分布式系统中实现资源共享和并发控制等功能。
- 其他功能:除了上述功能外,Redis 还支持消息队列、发布订阅、Lua 脚本等功能。
# Redis 的应用场景
- 缓存:Redis 作为内存数据库,读写速度非常快,可以作为缓存层使用。通过将热点数据存储在 Redis 中,可以减少对后端数据库的访问次数,提高网站的访问速度。
- 分布式系统:Redis 支持分布式存储和复制等功能,可以用于构建分布式系统。通过将数据分散到多个节点上存储,可以实现数据的分布式处理和容灾等功能。
- 消息队列:Redis 可以作为消息队列使用,可以实现异步处理和消息的发布订阅等功能。通过将消息存储在 Redis 中,可以实现消息的持久化和可靠传输等功能。
- 数据库扩展:Redis 可以作为数据库的扩展使用,可以实现数据的快速读写和处理等功能。通过将部分数据存储在 Redis 中,可以减轻数据库的压力,提高系统的性能和可靠性。
- 实时分析:Redis 的快速读写能力使其成为实时分析工具的理想选择。它可以作为数据缓冲层,为实时分析提供足够的数据存储空间和查询性能。
- 社交网络:Redis 可以用于实现社交网络中的各种功能,如用户认证、内容发布、好友关系管理等。它的高速读写和丰富的数据结构使得这些操作变得简单高效。
- 游戏开发:在游戏开发中,Redis 可以作为后端服务器的一部分来处理游戏逻辑和玩家数据。它提供的高性能和快速响应使得游戏体验更加流畅。
- 物联网:在物联网应用中,Redis 可以用于存储和管理传感器数据、设备状态等信息。它的持久化和分布式特性使得物联网设备能够可靠地共享和同步数据。
- 缓存网关:Redis 可以作为缓存网关来优化 API 请求的性能。它能够快速地响应 API 请求并减少对后端服务的调用次数,从而提高系统的吞吐量和响应速度。
- 实时推荐系统:在实时推荐系统中,Redis 可以用于存储用户行为数据、商品信息等实时更新的数据。它能够快速地处理推荐算法的计算和查询请求,为用户提供个性化的推荐服务。
# Redis 的未来
随着互联网的不断发展,Redis 的应用场景也将越来越广泛。未来,Redis 可能会在以下几个方面有更大的发展:
- 分布式系统:随着云计算和大数据技术的发展,分布式系统将更加普及。Redis 作为分布式系统的重要组成部分,将会在数据存储、数据同步和容灾等方面发挥更大的作用。
- 人工智能:人工智能的发展需要大量的数据处理和分析,Redis 的高性能和丰富的数据结构可以满足这些需求。未来,Redis 可能会在人工智能领域有更广泛的应用。
- 物联网:物联网的发展需要大量的数据采集和处理,Redis 的高性能和低延迟可以满足这些需求。未来,Redis 可能会在物联网领域有更广泛的应用。
- 区块链:区块链技术需要大量的数据存储和验证,Redis 的高可靠性和数据持久化可以满足这些需求。未来,Redis 可能会在区块链领域有更广泛的应用。
# Redis6 安装
wget https://download.redis.io/releases/redis-6.0.9.tar.gz
tar xzf redis-6.0.9.tar.gz
cd redis-6.0.9
make
2
3
4
如果安装报错,查看 gcc 版本
gcc -v
centos7 默认版本为 4.8.5,而 redis6.0 + 需要的 gcc 版本为 5.3 及以上,所以升级 gcc 即可
//升级gcc到9以上
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
2
3
//临时将此时的gcc版本改为9
scl enable devtoolset-9 bash
//或永久改变
echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
2
3
4
查看 gcc 版本
gcc -v
重新 make 即可。
# redis 启动三个警告
tcp-blok 积压问题
WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
内存设置为 0!在内存不足的情况下,后台保存可能会失败,建议设置为 1.
WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
操作系统默认的内存页大小是 4kB,可以如果使用更大的内存页比如 2MB,就可以使用同样多的页表项,管理更大的内存空间,但是对于 redis 这样的内存数据库,它会导致内存分配的速度变慢,并且导致内存的实际使用率下降,因此 redis 推荐我们关闭此项
WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo madvise > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled (set to 'madvise' or 'never').
# 前两个问题解决如下:
vim /etc/sysctl.conf
加入如下
# redis 设置挤压,可以查看redis.cnf 文件里也有关于tcp-backlog
net.core.somaxconn=2048
# 和tcp-backlog 有关
net.ipv4.tcp_max_syn_backlog = 2048
# 内存设置为0!在内存不足的情况下,后台保存可能会失败
vm.overcommit_memory=1
2
3
4
5
6
查看是否添加
sysctl -p
# 最后一个问题
vim /etc/rc.local
加入如下
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
让配置生效
source /etc/rc.local