Redis配置与数据类型

Redis配置

Redis的配置文件位于Redis安装目录下,文件名为 redis.conf(Windows 名为redis.windows.conf)。你可以通过config命令查看或设置配置项。

⚠️不推荐对原始的redis.conf文件进行修改,推荐重新建一个配置文件进行修改,然后运行自己创建的配置文件

查看配置

语法

1
127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
127.0.0.1:6379> config get dbfilename #获取某个配置项
1) "dbfilename"
2) "dump.rdb"
127.0.0.1:6379> config get * # 获取所有配置项
1) "dbfilename"
2) "dump.rdb"
3) "requirepass"
4) ""
5) "masterauth"
6) ""
7) "cluster-announce-ip"
8) ""
9) "unixsocket"
10) ""
11) "logfile"
12) ""
13) "pidfile"
14) ""
15) "slave-announce-ip"
16) ""
17) "replica-announce-ip"
18) ""
19) "maxmemory"
20) "0"
……
208) "0"
209) "slaveof"
210) ""
211) "notify-keyspace-events"
212) ""
213) "bind"
214) ""

修改配置

你可以通过修改redis.conf文件或使用config set命令来修改配置。

语法

1
127.0.0.1:6379> config set CONFIG_SETTING_NAME NEW_CONFIG_VALUE

示例

1
2
3
4
5
127.0.0.1:6379> config set loglevel "notice"
OK
127.0.0.1:6379> config get loglevel
1) "loglevel"
2) "notice"

参数说明

redis.conf 配置项说明如下:

类型配置项说明
基本daemonize no是否以守护进程的方式运行,默认为 no,使用yes启用守护进程
基本databases 16设置数据库的数量,默认数据库为0,可以使用SELECT命令在连接上指定数据库id
基本stop-writes-on-bgsave-error yes后台存储错误停止写,默认为 yes
基本save <seconds> <changes>指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合。Redis默认配置文件中提供了三个条件:save 900 1save 300 10save 60 10000
基本rdbcompression yes指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大。
基本rdbchecksum yes存储和加载rdb文件时校验,默认为 yes
基本dbfilename dump.rdb指定本地数据库文件名,默认值为dump.rdb
基本dir ./指定本地数据库存放目录,默认为当前安装目录
主从slaveof <masterip> <masterport>设置当本机为slave服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
主从masterauth <master-password>当master服务设置了密码保护时,slav服务连接master的密码
主从slave-serve-stale-data yes当主从断开或正在复制中,从服务器是否应答,默认为 yes
主从repl-disable-tcp-nodelay no主端是否合并数据,大块发送给slave
主从slave-priority 100如果master不能再正常工作,那么会在多个slave中,选择优先值最小的一个slave提升为master,优先值为0表示不能提升为master。
主从slave-read-only yes从服务器只读,默认为 yes
主从repl-ping-slave-period 10从ping主的时间间隔,秒为单位
主从repl-timeout 60主从超时时间(超时认为断线了),要比period大
安全requirepass foobared设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH命令提供密码,默认关闭
安全rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52如果公共环境,可以重命名部分敏感命令,如config
限制maxclients 128设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息
限制maxmemory <bytes>指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
限制maxmemory-policy volatile-lru内存到极限后的处理
1. volatile-lru -> LRU 算法删除过期key
2. allkeys-lru -> LRU算法删除key(不区分过不过期)
3. volatile-random -> 随机删除过期key
4. allkeys-random -> 随机删除key(不区分过不过期)
5. volatile-ttl -> 删除快过期的key
6. noeviction -> 不删除,返回错误信息
日志模式appendonly no指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
日志模式appendfilename appendonly.aof指定更新日志文件名,默认为appendonly.aof
日志模式appendfsync everysec指定更新日志条件,共有3个可选值:
no:表示等操作系统进行数据缓存同步到磁盘(快)
always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
everysec:表示每秒同步一次(折衷,默认值)
日志模式no-appendfsync-on-rewrite no为yes,则其他线程的数据放内存里,合并写入(速度快,容易丢失的多)
日志模式auto-AOF-rewrite-percentage 100aof文件增长比例,指当前aof文件比上次重写的增长比例大小。aof重写即在aof文件在一定大小之后,重新将整个内存写到aof文件当中,以反映最新的状态(相当于bgsave)。这样就避免了,aof文件过大而实际内存数据小的问题(频繁修改数据问题)。
日志模式auto-AOF-rewrite-min-size 64mbaof文件重写最小的文件大小,即最开始aof文件必须要达到这个文件时才触发,后面的每次重写就不会根据这个变量了(根据上一次重写完成之后的大小),此变量仅初始化启动redis有效。如果是redis恢复时,则lastSize等于初始aof文件大小。
日志模式aof-load-truncated yes指redis在恢复时,会忽略最后一条可能存在问题的指令。默认值yes。即在aof写入时,可能存在指令写错的问题(突然断电,写了一半),这种情况下,yes会log并继续,而no会直接恢复失败。
日志loglevel verbose指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
日志logfile stdout日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
连接auth 密码密码登陆(如果有密码)
连接ping测试服务器是否可用
连接echo "some content"测试服务器是否正常交互
连接select 0/1/2…选择数据库
连接quit退出连接
服务端shutdown [save/nosave]关闭服务器,保存数据,修改AOF(如果设置)
服务端flushdb清空当前数据库的所有数据
服务端flushall清空所有数据库的所有数据(误用了怎么办?)
服务端config get 选项(支持*通配)
config set 选项 值
config rewrite
config restart
获取配置项
修改配置项
把值写到配置文件
更新info命令的信息
服务端time
dbsize
bgrewriteaof
bgsave
save
lastsave
1. 返回时间戳+微秒
2. 返回key的数量
3.重写aof
4. 在后台异步保存当前数据库的数据到磁盘
5. 执行一个同步保存操作,将当前 Redis 实例的所有数据快照(snapshot)以 RDB 文件的形式保存到硬盘
6.返回最近一次 Redis 成功将数据保存到磁盘上的时间,以 UNIX 时间戳格式表示
服务端monitor打开控制台,观察命令(调试用)
服务端client list
client kill
client getname
client setname "名称"
1. 列出所有连接
2. 杀死某个连接 CLIENT KILL 127.0.0.1:43501
3. 获取连接的名称 默认nil
4. 设置连接名称,便于调试
慢查询slowlog get获取慢查询日志
慢查询slowlog len获取慢查询日志条数
慢查询slowlog reset清空慢查询
慢查询slowlog-log-slower-than 10000记录响应时间大于10000微秒的慢查询。
慢查询slowlog-max-len 128最多记录128条

Redis数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

String

  1. string 是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个 key 对应一个 value。
  2. string 类型是二进制安全的。意思是Redis的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
  3. string 类型是Redis最基本的数据类型,string 类型的值最大能存储 512MB。
1
2
3
4
127.0.0.1:6379> set name "redis"
OK
127.0.0.1:6379> get name
"redis"

Hash

  1. Redis hash 是一个键值(key=>value)对集合。
  2. Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
  3. 每个 hash 可以存储 2^32-1 键值对(40多亿)
  4. 存储、读取、修改用户属性
1
2
3
4
5
6
7
127.0.0.1:6379> del name # 用于删除前面测试用过的 key,不然会报错:(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> hmset name field1 "Hello" field2 "World"
"OK"
127.0.0.1:6379> hget name field1
"Hello"
127.0.0.1:6379> hget name field2
"World"

List

  1. Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
  2. 列表最多可存储 2^32-1 元素 (4294967295, 每个列表可存储40多亿)。

实例

1
2
3
4
5
6
7
8
9
10
11
127.0.0.1:6379> del name
127.0.0.1:6379> lpush name redis
(integer) 1
127.0.0.1:6379> lpush name mongodb
(integer) 2
127.0.0.1:6379> lpush name mysql
(integer) 3
127.0.0.1:6379> lrange name 0 10
1) "mysql"
2) "mongodb"
3) "redis"

Set

  1. Redis的Set是string类型的无序集合,提供了求交集、并集、差集等操作。
  2. 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
  3. 集合中最大的成员数为 2^32-1(4294967295, 每个集合可存储40多亿个成员)。
  4. sadd 命令:添加一个 string 元素到 key 对应的 set 集合中,成功返回1,如果元素已经在集合中返回 0,如果 key 对应的 set 不存在则返回错误。
  5. 共同好友、利用唯一性,统计访问网站的所有独立ip、好友推荐时,根据tag求交集,大于某个阈值就可以推荐
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    127.0.0.1:6379> del name
    127.0.0.1:6379> sadd name redis
    (integer) 1
    127.0.0.1:6379> sadd name mongodb
    (integer) 1
    127.0.0.1:6379> sadd name mongodb
    (integer) 0
    127.0.0.1:6379> sadd name mysql
    (integer) 1
    127.0.0.1:6379> smembers name
    1) "redis"
    2) "rabitmq"
    3) "mongodb"

zset

  1. Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
  2. 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
  3. zset的成员是唯一的,但分数(score)却可以重复。
  4. zadd 命令:添加元素到集合,元素在集合中存在则更新对应score
  5. 排行榜、带权重的消息队列

格式:zadd key score member

1
2
3
4
5
6
7
8
9
10
11
12
13
127.0.0.1:6379> del name
127.0.0.1:6379> zadd name 0 redis
(integer) 1
127.0.0.1:6379> zadd name 0 mongodb
(integer) 1
127.0.0.1:6379> zadd name 0 mysql
(integer) 1
127.0.0.1:6379> zadd name 0 mysql
(integer) 0
127.0.0.1:6379> > zrangebyscore name 0 1000
1) "mongodb"
2) "mysql"
3) "redis"