Redis:(0) Redis 特性

发布时间:2026/7/8 16:35:38

Redis:(0) Redis 特性 1.介绍Redis是一款开源的、高性能的键-值存储。它常被称作是一款数据结构服务器。Redis的键值可以包括字符串strings类型同时它还包括哈希hashes、列表lists、集合sets和 有序集合sorted sets等数据类型。 对于这些数据类型可以执行原子操作。为了获得优异的性能Redis采用了内存中数据集的方式。同时Redis支持数据的持久化可以每隔一段时间将数据集转存到磁盘上或者在日志尾部追加每一条操作命令append only file,aof。Redis同样支持主从复制并且具有非常快速的非阻塞首次同步、网络断开自动重连等功能。同时Redis还具有其它一些特性其中包括简单的事物支持、发布订阅 pub/sub、管道pipeline和虚拟内存vm等 。2.安装若要启用 systemd使用 wsl.conf 通过管理员权限在文本编辑器中打开并将以下行添加到 /etc/wsl.conf然后从 PowerShell 使用 wsl.exe --shutdown 来关闭以便重启重启后使用 systemctl list-unit-files --typeservice 命令确认。[boot]systemdtruesudo apt update sudo apt install redis-server -y # 安装 redis redis-server --version # 检查安装是否成功 redis-cli --version sudo service redis-server start # SysVinit 服务管理启动 Redis 服务 sudo systemctl start redis-server # systemd 服务管理WSL2 未启用 systemd无法使用 systemctl 命令 redis-server # 进程级前台运行 sudo redis-server /etc/redis/redis.conf --daemonize yes # 进程级以守护进程方式启动 sudo service redis-server status # 检查服务状态 redis-cli ping # 测试连接 sudo service redis-server stop # 停止 Redis 服务3.配置对/etc/redis/redis.conf修改3.1 守护进程Redis默认不是以守护进程的方式运行可以通过该配置项修改使用yes启用守护进程daemonize no3.2 pid 文件当Redis以守护进程方式运行时Redis默认会把pid写入/var/run/redis.pid文件可以通过pidfile指定pidfile /var/run/redis.pid3.3 监听端口指定Redis监听端口默认端口为6379port 63793.4 主机地址绑定的主机地址bind 127.0.0.13.5 客户端闲置关闭时间当 客户端闲置多长时间后关闭连接如果指定为0表示关闭该功能timeout 3003.6 日志记录级别Redis总共支持四个级别debug、verbose、notice、warning默认为verboseloglevel verbose3.7 日志记录方式默认为标准输出如果配置Redis为守护进程方式运行而这里又配置为日志记录方式为标准输出则日志将会发送给/dev/nulllogfile stdout3.8 数据库的数量默认数据库为0可以使用SELECT dbid命令在连接上指定数据库iddatabases 163.9 数据同步指定在多长时间内有多少次更新操作就将数据同步到数据文件可以多个条件配合save seconds changesRedis默认配置文件中提供了三个条件save 900 1save 300 10save 60 10000分别表示900秒15分钟内有1个更改300秒5分钟内有10个更改以及60秒内有10000个更改。清空save则不会保存到rdb文件3.10 是否压缩数据指定存储至本地数据库时是否压缩数据默认为yesRedis采用LZF压缩如果为了节省CPU时间可以关闭该选项但会导致数据库文件变的巨大rdbcompression yes3.11 本地数据库文件名默认值为dump.rdbdbfilename dump.rdb3.12 本地数据库存放目录dir ./3.13 slave设置设置当本机为slave服务时设置master服务的IP地址及端口在Redis启动时它会自动从master进行数据同步slaveof masterip masterport3.14 连接到master的密码当master服务设置了密码保护时slav服务连接master的密码masterauth master-password3.15 Redis连接密码如果配置了连接密码客户端在连接Redis时需要通过AUTH password命令提供密码默认关闭requirepass foobared3.16 同一时间最大客户端连接数默认无限制Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数如果设置 maxclients 0表示不作限制。当客户端连接数到达限制时Redis会关闭新的连接并向客户端返回max number of clients reached错误信息maxclients 1283.17 最大内存限制Redis在启动时会把数据加载到内存中达到最大内存后Redis会先尝试清除已到期或即将到期的Key当此方法处理后仍然到达最大内存设置将无法再进行写入操作但仍然可以进行读取操作。Redis新的vm机制会把Key存放内存Value会存放在swap区maxmemory bytes3.18 日志记录指定是否在每次更新操作后进行日志记录Redis在默认情况下是异步的把数据写入磁盘如果不开启可能会在断电时导致一段时间内的数据丢失。因为 redis 本身同步数据文件是按上面save条件来同步的所以有的数据会在一段时间内只存在于内存中。默认为noappendonly no3.19 日志文件名指定更新日志文件名默认为appendonly.aofappendfilename appendonly.aof3.20 更新日志条件共有3个可选值no表示等操作系统进行数据缓存同步到磁盘快 always表示每次更新操作后手动调用fsync()将数据写到磁盘慢安全 everysec表示每秒同步一次折衷默认值appendfsync everysec3.21 启用虚拟内存默认值为noVM机制将数据分页存放由Redis将访问量较少的页即冷数据swap到磁盘上访问多的页面由磁盘自动换出到内存中vm-enabled no3.22 虚拟内存文件路径默认值为/tmp/redis.swap不可多个Redis实例共享vm-swap-file /tmp/redis.swap3.23 vm-max-memory将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0vm-max-memory 03.24 vm-page-sizeRedis swap文件分成了很多的page一个对象可以保存在多个page上面但一个page上不能被多个对象共享vm-page-size是要根据存储的 数据大小来设定的作者建议如果存储很多小对象page大小最好设置为32或者64bytes如果存储很大大对象则可以使用更大的page如果不 确定就使用默认值vm-page-size 323.25 设置swap文件中的page数量由于页表一种表示页面空闲或使用的bitmap是在放在内存中的在磁盘上每8个pages将消耗1byte的内存。vm-pages 1342177283.26 设置访问swap文件的线程数最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的可能会造成比较长时间的延迟。默认值为4vm-max-threads 43.27 客户端应答包合并设置在向客户端应答时是否把较小的包合并为一个包发送默认为开启glueoutputbuf yes3.28 哈希指定在超过一定的数量或者最大的元素超过某一临界值时采用一种特殊的哈希算法hash-max-zipmap-entries 64hash-max-zipmap-value 5123.29 重置哈希指定是否激活重置哈希默认为开启activerehashing yes3.30 指定包含其它的配置文件可以在同一主机上多个Redis实例之间使用同一份配置文件而同时各个实例又拥有自己的特定配置文件include /path/to/local.conf4.支持的数据类型Redis是一个key-value的数据库key一般是String类型格式设置为[项目名]:[业务名]:[类型]:[id]。不过value的类型多种多样String: hello world包含字符串、int、float- SET添加或者修改已经存在的一个String类型的键值对- GET根据key获取String类型的value- MSET批量添加多个String类型的键值对- MGET根据多个key获取多个String类型的value- INCR让一个整型的key自增1- INCRBY: 让一个整型的key自增并指定步长例如incrby num 2 让num值自增2- INCRBYFLOAT让一个浮点类型的数字自增并指定步长- SETNX添加一个String类型的键值对前提是这个key不存在否则不执行- SETEX添加一个String类型的键值对并且指定有效期Hash: {name: Jack, age: 21}- HSET key field value添加或者修改hash类型key的field的值- HGET key field获取一个hash类型key的field的值- HMSET批量添加多个hash类型key的field的值- HMGET批量获取多个hash类型key的field的值- HGETALL获取一个hash类型的key中的所有的field和value- HKEYS获取一个hash类型的key中的所有的field- HVALS获取一个hash类型的key中的所有的value- HINCRBY: 让一个hash类型key的字段值自增并指定步长- HSETNX添加一个hash类型的key的field值前提是这个field不存在否则不执行List: [A - B - C - C]- LPUSH key element ... 向列表左侧插入一个或多个元素- LPOP key移除并返回列表左侧的第一个元素没有则返回nil- RPUSH key element ... 向列表右侧插入一个或多个元素- RPOP key移除并返回列表右侧的第一个元素- LRANGE key star end返回一段角标范围内的所有元素- BLPOP和BRPOP与LPOP和RPOP类似只不过在没有元素时等待指定时间而不是直接返回nilSet: {A, B, C}- SADD key member ... 向set中添加一个或多个元素- SREM key member ... : 移除set中的指定元素- SCARD key返回set中元素的个数- SISMEMBER key member: 判断一个元素是否存在于set中- SMEMBERS获取set中的所有元素- SINTER key1 key2 ... 求key1与key2的交集- SDIFF key1 key2 ... 求key1与key2的差集- SUNION key1 key2 ..求key1和key2的并集SortedSet: {A: 1, B: 2, C: 3}SortedSet中的每一个元素都带有一个score属性可以基于score属性对元素排序底层的实现是一个跳表SkipList加 hash表。SortedSet具备下列特性可排序、元素不重复、查询速度快因为SortedSet的可排序特性经常被用来实现排行榜这样的功能。- ZADD key score member添加一个或多个元素到sorted set如果已经存在则更新其score值- ZREM key member删除sorted set中的一个指定元素- ZSCORE key member获取sorted set中的指定元素的score值- ZRANK key member获取sorted set 中的指定元素的排名- ZCARD key获取sorted set中的元素个数- ZCOUNT key min max统计score值在给定范围内的所有元素的个数- ZINCRBY key increment member让sorted set中的指定元素自增步长为指定的increment值- ZRANGE key min max按照score排序后获取指定排名范围内的元素- ZRANGEBYSCORE key min max按照score排序后获取指定score范围内的元素- ZDIFF、ZINTER、ZUNION求差集、交集、并集GEO: {A: (120.3, 30.5)}BitMap: 0110110101110101011HyperLog: 01101101011101010115.持久化redis是支持持久化的内存数据库即redis需要经常将内存中的数据同步到磁盘来保证持久化这是相对memcache来说的一个大的优势。redis支持两种持久化方式一种是 Snapshotting快照也是默认方式另一种是Append-only file缩写aof的方式。Snapshotting快照是默认的持久化方式。这种方式将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。可以配置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key被修改就自动做快照默认的快照保存配置save 900 1 #900秒内如果超过1个key被修改则发起快照保存save 300 10 #300秒内容如超过10个key被修改则发起快照保存save 60 10000Append-only fileaof 比快照方式有更好的持久化性是由于在使用aof持久化方式时,redis会将每一个收到的写命令都通过write函数追加到文件中(默认是 appendonly.aof)。当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。当然由于os会在内核中缓存 write做的修改所以可能不是立即写到磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改。不过我们可以通过配置文件告诉redis我们想要 通过fsync函数强制os写入到磁盘的时机。方式如下默认是每秒fsync一次appendonly yes //启用aof持久化方式appendfsync always //每次收到写命令就立即强制写入磁盘最慢的但是保证完全的持久化不推荐使用appendfsync everysec //每秒钟强制写入磁盘一次在性能和持久化方面做了很好的折中推荐appendfsync no //完全依赖os性能最好,持久化没保证6.主从复制主从复制允许多个slave server拥有和master server相同的数据库副本特点1.master可以有多个slave2.除了多个slave连到相同的master外slave也可以连接其他slave形成图状结构3.主从复制不会阻塞master。也就是说当一个或多个slave与master进行初次同步数据时master可以继续处理client发来的请求。相反slave在初次同步数据时则会阻塞不能处理client的请求。4.主从复制可以用来提高系统的可伸缩性可以用多个slave 专门用于client的读请求比如sort操作可以使用slave来处理也可以用来做简单的数据冗余。5.可以在master禁用数据持久化只需要注释掉master 配置文件中的所有save配置然后只在slave上配置数据持久化。7.事务Multi 事物开始Exec 执行事务Discard 放弃事务Watch 监听keyUnwatch 放弃所有key的监听如WATCH balance # 监视 key balanceMULTIDECRBY balance 100 # 扣100INCR total_orders # 订单1EXEC # 提交如果在 WATCH 之后、EXEC 之前别的客户端修改了 balance那么 EXEC 会失败返回 nil扣款操作不会执行。Redis 对事务的支持相对简单它不提供传统数据库的 ACID 特性但能保证一个客户端发起的事务中所有命令在 EXEC 时原子性、顺序执行期间不会被其他客户端命令打断。使用 WATCH 命令可以监视指定 key若在事务执行前这些 key 被其他客户端修改则整个事务将失败返回 nil以此实现乐观锁机制。WATCH 监听和事务状态均绑定当前连接连接断开后自动清除。注意Redis 事务不支持回滚也不保证隔离性 —— 其他客户端仍可并发修改数据因此依赖 WATCH 检测冲突。8.发布订阅发布订阅(pub/sub)是一种消息通信模式。订阅者可以通过subscribe和psubscribe命令向redis server订阅自己感兴趣的消息类型redis将消息类型称为通道(channel)。当发布者通过publish命令向redis server发送特定类型的消息时。订阅该消息类型的全部client都会收到此消息。这里消息的传递是多对多的。一个client可以订阅多个 channel,也可以向多个channel发送消息。SubscribeUnsubscribePsubscribePunsubscribePublish9.管道redis是一个cs模式的tcp server使用和http类似的请求响应协议。一个client可以通过一个socket连接发起多个请求命令。每个请求命令发出后client通常 会阻塞并等待redis服务处理redis处理完后请求命令后会将结果通过响应报文返回给client。基本的通信过程如下Client:INCRXServer: 1Client:INCRXServer: 2Client:INCRXServer: 3Client:INCRXServer: 4基本上四个命令需要8个tcp报文才能完成。由于通信会有网络延迟,假如从client和server之间的包传输时间需要0.125秒。那么上面的四个命令8个报文至少会需要1秒才能完成。利用pipeline的方式从client打包多条命令一起发出不需要等待单条命令的响应返回而redis服务端会处理完多条命令后会将多条命令的处理结果打包到一起返回给客户端。通信过程如下Client:INCRXClient:INCRXClient:INCRXClient:INCRXServer: 1Server: 2Server: 3Server: 4

相关新闻