暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis 技术概览:现在还有不用Redis的嘛

老王两点中 2025-03-12
11

Redis(Remote Dictionary Server)是一个开源的键值存储系统,以其高性能、低延迟和丰富的数据结构而闻名。Redis 支持多种数据类型,如字符串、列表、集合、哈希表、有序集合等,并且可以通过 Redis 模块扩展功能。本文将详细介绍 Redis 的核心特性、应用场景以及如何使用 Redis 来解决实际问题。

一、Redis 核心特性

1. 内存存储

• 高速读写:Redis 将所有数据存储在内存中,这意味着它可以提供非常高的读写速度。

• 持久化选项:虽然 Redis 主要是一个内存数据库,但它也提供了两种持久化方式:RDB 快照和 AOF 日志,以防止数据丢失。

2. 多种数据结构

• 字符串:最基础的数据类型,可以存储任何类型的数据。

• 列表:双向链表,支持两端的 push 和 pop 操作。

• 集合:无序的字符串集合,集合内的元素是唯一的。

• 哈希表:键值对的集合,可以存储复合数据类型。

• 有序集合:与集合类似,但每个元素都有一个分数关联,用于排序。

• Stream流:类似于队列,但支持更丰富的功能,如消费组、消息过期等。

• Bitmaps:使用位来表示数据的存在与否,非常适合存储大量二元状态数据。

• HyperLogLog:用于估算集合中不重复元素的数量,适用于统计网站访问者数量等场景。

 Geo:用于存储和查询地理位置数据,支持添加位置、计算距离、查找附近的位置等功能。

3. 网络透明性

• 客户端/服务器架构:Redis 使用标准 TCP 协议,可以轻松地在网络中部署。

• 支持多种客户端:Redis 提供了多种语言的客户端库,方便开发者使用。

4. 高可用性

• 主从复制:支持主从复制,可以实现数据备份和读写分离。

• 集群:Redis 3.0 之后支持集群,可以实现自动分区和故障转移。

5. 原子性

• 原子操作:Redis 的大部分命令都是原子性的,确保了数据的一致性。

• 事务:支持简单的事务机制,可以将多个命令打包成一个事务执行。

6. 脚本支持

• Lua 脚本:Redis 支持 Lua 脚本,可以编写复杂的业务逻辑,并保证原子性。

二、Redis 应用场景

1. 缓存

• Web 应用缓存:Redis 作为 Web 应用的缓存层,可以显著提高应用性能。

• API 缓存:将 API 请求的结果缓存在 Redis 中,以减少后端系统的负载。

2. 会话存储

• Web 会话存储:使用 Redis 来存储用户的会话数据,可以实现跨服务器的会话共享。

3. 实时消息系统

• 消息队列:使用 Redis 的列表或流作为消息队列,可以实现消息的发布/订阅。

• 实时通知:使用 Redis 的 Pub/Sub 功能来发送实时通知。

4. 实时数据分析

• 统计计数:使用 Redis 的 HyperLogLog 来估算不重复元素的数量。

• 实时图表:使用 Redis 的时间序列数据结构来存储和查询时间序列数据。

5. 排行榜

• 排行榜:使用 Redis 的有序集合来维护用户排名。

• 推荐系统:使用 Redis 的数据结构来实现推荐算法。

6. 分布式锁

• 分布式锁:使用 Redis 的 SETNX 命令实现简单的分布式锁。

• 乐观锁:使用 Redis 的 WATCH 命令实现乐观锁机制。

7. 任务调度

• 定时任务:使用 Redis 的有序集合来存储定时任务。

• 任务队列:使用 Redis 的列表或流来实现任务队列。

三、Redis 使用示例

假设我们要构建一个简单的在线投票系统,使用 Redis 来存储投票数据。

1. 初始化投票

    # 创建投票主题
    redis-cli SET vote_topic "Best Programming Language"
    # 初始化候选选项
    redis-cli SADD vote_options "Python"
    redis-cli SADD vote_options "JavaScript"
    redis-cli SADD vote_options "Go"
    redis-cli SADD vote_options "Rust"


    # 初始化投票计数
    redis-cli HMSET vote_count Python 0 JavaScript 0 Go 0 Rust 0
    复制

    2. 投票

      # 用户为 Python 投票
      redis-cli HINCRBY vote_count Python 1
      复制

      3. 查询结果

        # 查询投票结果
        redis-cli HGETALL vote_count
        复制

        4. 统计总票数

          # 统计总票数
          redis-cli HVALS vote_count | awk '{s+=$1} END {print s}'
          复制

          5. 获取投票主题

            # 获取投票主题
            redis-cli GET vote_topic
            复制

            四、性能与优化

            1. 内存管理

            合理分配内存资源,避免内存溢出。

            2. 命令优化

            使用正确的命令组合来减少网络传输和提高性能。

            3. 数据过期

            设置数据过期时间来自动清理不再需要的数据。

            4. 批处理

            使用管道(pipelining)来减少网络往返次数。

            五、Redis安装部署脚本

            1. redis-install.sh

              #! usr/bin/bash
              ##redis任何版本全程自动化源码编译安装
              version=$1
              usage(){
                echo "usage: $0 version"
              }
              if [ $# -ne 1 ]; then
                 usage
                 exit -1
              fi


              #Redis安装包下载
              cd /usr/local/src
              if [ ! -f redis-${version}.tar.gz ]; then
                 curl -o usr/local/src/redis-${version}.tar.gz http://download.redis.io/releases/redis-${version}.tar.gz
              fi


              #Redis依赖包安装
              yum clean all
              yum makecache fast
              yum -y install gcc gcc-c++ tcl


              #编译Redis所需要的gcc
              yum -y install centos-release-scl
              yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
              source /opt/rh/devtoolset-9/enable
              echo "source opt/rh/devtoolset-9/enable" >>/etc/profile
              gcc --version


              ##内系统参数核优化
              cat >> etc/rc.d/rc.local << "EOF"


              ##关闭Linux的THP(内存管理系统)通过使用更大的内存页面,来减少具有大量内存的计算机上的TLB的开销
              if [ -f sys/kernel/mm/transparent_hugepage/enabled ]; then
                 echo never > sys/kernel/mm/transparent_hugepage/enabled
              fi


              if [ -f sys/kernel/mm/transparent_hugepage/defrag ]; then
                echo never > sys/kernel/mm/transparent_hugepage/defrag
              fi
              EOF
              chmod u+x etc/rc.d/rc.local


              if [ -f /sys/kernel/mm/transparent_hugepage/enabled ]; then
                echo never > /sys/kernel/mm/transparent_hugepage/enabled
              fi


              if [ -f /sys/kernel/mm/transparent_hugepage/defrag ]; then
                echo never > /sys/kernel/mm/transparent_hugepage/defrag
              fi


              cat >> /etc/sysctl.conf << "EOF"


              #Linux系统内核参数优化
              net.core.somaxconn = 2048
              net.ipv4.tcp_max_syn_backlog = 2048
              vm.overcommit_memory = 1
              EOF
              sysctl -p


              cat > /etc/security/limits.conf << "EOF"
              root soft nofile 65535
              root hard nofile 65535
              * soft nofile 65535
              * hard nofile 65535
              EOF


              #Redis编译安装
              cd /usr/local/src
              tar -zxvf redis-${version}.tar.gz
              cd /usr/local/src/redis-${version}
              make
              make PREFIX=/usr/local/redis install


              #Redis基础配置
              mkdir -p /usr/local/redis/{etc,logs,data}
              egrep -v "^$|^#" /usr/local/src/redis-${version}/redis.conf > /usr/local/redis/etc/redis.conf
              # sed -i "s/bind 127.0.0.1/bind 0.0.0.0/g" /usr/local/redis/etc/redis.conf
              sed -i "s/protected-mode yes/protected-mode no/g" /usr/local/redis/etc/redis.conf
              sed -i "s/daemonize no/daemonize yes/g" /usr/local/redis/etc/redis.conf
              sed -i "s/pidfile \/var\/run\/redis_6379.pid/pidfile \/usr\/local\/redis\/redis.pid/g" /usr/local/redis/etc/redis.conf
              sed -i "s/dir \.\//dir \/usr\/local\/redis\/data/g" /usr/local/redis/etc/redis.conf
              sed -i "s/logfile \"\"/logfile \"\/usr\/local\/redis\/logs\/redis.log\"/g" /usr/local/redis/etc/redis.conf
              sed -i "s/dbfilename dump.rdb/dbfilename dump.rdb/g" /usr/local/redis/etc/redis.conf
              sed -i "s/appendfilename \"appendonly.aof\"/appendfilename \"appendonly.aof\"/g" /usr/local/redis/etc/redis.conf


              #PATH配置
              echo "export PATH=${PATH}:/usr/local/redis/bin" >>/etc/profile
              source /etc/profile
              #启动redis服务
              /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
              #查看redis监听端口
              netstat -tanp|grep redis
              复制

              脚本使用说明

                chmod 755 redis-install.sh  
                sh redis-install.sh 4.0.10
                #用法:sh redis-install.sh 4.0.10 (后面跟的是你需要的版本号,需要什么版本就写什么版本),我这里安装的4.0.10
                复制

                2. Docker 部署

                  # 拉取最新镜像
                  docker pull redis:latest
                  # 运行
                  docker run --name my-redis \
                             -v redis-data:/data \
                             -v /path/to/redis.conf:/usr/local/etc/redis/redis.conf \
                             -p 6379:6379 \
                             -d redis redis-server /usr/local/etc/redis/redis.conf
                             
                  这里的参数解释如下:
                  •--name my-redis: 为容器命名。
                  •-v redis-data:/data: 将数据卷 redis-data 挂载到容器的 /data 目录。
                  •-v /path/to/redis.conf:/usr/local/etc/redis/redis.conf: 将宿主机上的 Redis 配置文件挂载到容器内的 /usr/local/etc/redis/redis.conf。
                  •-p 6379:6379: 映射容器的 6379 端口到宿主机的 6379 端口。
                  •-d: 后台运行容器。
                  # 启动
                  redis redis-server /usr/local/etc/redis/redis.conf: 指定使用挂载的配置文件启动 Redis。
                  # 检查 Redis 服务器是否正常运行
                  docker exec my-redis redis-cli ping


                  复制

                  六、Redis总结

                  Redis 是一个非常强大且灵活的键值存储系统,适用于多种应用场景。通过合理使用 Redis 的数据结构和特性,可以显著提高应用的性能和可靠性。随着 Redis 社区的不断发展壮大,Redis 将继续成为数据处理领域的重要工具之一。

                  文章转载自老王两点中,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论