# Redis



# 一、介绍

1、express 介绍

redis 是一种基于键值对的 NoSQL 数据库,redis 中的值可以是 string、hash、list、set、zset(有序集合)、Bitmaps(位图)、GEO(地理信息定位) 等多种数据结构。

2、作者

2008 年,redis 作者是 Salvatore Sanifilippo 开发,为了实现高性能队列功能而开发了 redis。

3、特性

  • 速度快:使用 c 语言实现,数据存放在内存中,单线程架构
  • 基于键值对
  • 持久化:通过 RDB 或 AOF 策略将内存数据复制到硬盘中
  • 主从复制和分布式

4、使用场景

  • 缓存:加快数据访问速度,有效较低后端数据源压力。
  • 排行榜系统:
  • 计数器应用:如浏览器次数
  • 社交网络
  • 消息队列系统

# 二、跑起来

1、安装

wget https://download.redis.io/releases/redis-6.2.6.tar.gz
tar xzf redis-6.2.6.tar.gz
ln -s redis-6.2.6 redis
cd redis
make
make install

2、启动

// 根据配置文件启动 redis
redis-server /opt/redis/redis.conf

3、连接 redis 服务

redis-cli -h 127.0.0.1 -p 6379

# 三、操作 redis

1、常用全局命令

查看所有键:keys *

键总数:dbsize

检查键是否存在:exists key

删除键:del key

键过期:expire key seconds

查看键值的数据类型:type key

# 四、数据类型

1、字符串类型:可以是字符串、数字、二进制,最大值不超过512M

使用场景:限速、缓存、计数、共享 Session

2、哈希类型:键值对的形式

3、列表类型:存储多个有序的字符串

使用场景:消息队列、文章列表

4、集合类型:保存多个不重复的字符串

使用场景:给用户添加标签

5、有序集合:根据指定字段排序的集合

应用场景:排行榜

# 五、关键技术

1、单线程

  • 一条命令从客户端到达服务端不会立刻被执行,而是进入队列,然后逐个被执行

2、持久化

  • RDB:是把当前进程数据生成快照保存到硬盘的过程,分为手动触发和自动触发(从节点执行全量复制、执行shutdown等)
  • AOF:以独立日志的方式记录每次写命令,重启时重新执行 AOF 文件中的命令达到恢复数据的目的

3、复制

  • 为了解决单点问题,将数据复制到多个副本部署到其它机器

4、哨兵(Sentinel)

  • 用来解决主从复制模式下,判断节点不可达;主节点挂掉,保证只有一个从节点成为主节点‘;通知客户端新的主节点
  • 主节点选举:
    • 从节点 a 发现主节点下线,向其它从节点发送命令,要求将自己设置为主节点
    • 其它节点,如果没有同意过其它从节点的命令,就同意该命令,否则拒绝
    • 如果节点 a 发现自己票数超过一半,就会成为主节点
    • 否则进入下一次选举

# 六、最佳实践

1、内存优化

  • 缩减键和值的长度
  • 减少对字符串的修改如 append、setrange,改为直接使用 set
  • 优先使用整数,比字符串更节省空间

# 七、配置参数

port:端口

logfile:日志文件

dir:工作目录,存放持久文件和日志文件

daemonize:是否以守护进程启动 redis

# 八、专用名词

热数据:指需要频繁操作的数据

冷数据:指通常不怎么操作的数据

慢查询分析:是指系统在命令执行前后计算每条命令的执行时间,当超过阈值,将这条命令的信息记录下来供分析。

事务:表示一组动作,要么全部执行,要么全部不执行。

集群:干同样事的,如一群厨师

分布式:分工合作,如厨师和配菜师

# 参考资料

《Redis 开发与运维》付磊、张益军

分布式与集群的区别是什么? - 张鹏飞的回答 - 知乎 https://www.zhihu.com/question/20004877/answer/112124929