一、redis简介

一、声明

本文为整理的学习笔记,主要内容来自与redis学习中的那些参考资料。

这些学习资料里面最详细的是《redis核心技术与实战》和《可能是北半球最全面的Redis6.x系列文章》,都是很详细的讲解redis。

因为时间、以及文字表达能力有限,所以文中有很多内容就直接摘抄使用了原文。有一些地方有标记,有一些地方没有标记。

如果转载此文章,需要把参考资料中的所有链接都标记上。

二、redis是什么?

redis是一个基于BSD许可的开源内存数据结构存储,可以用作数据库、缓存和消息代理。

redis支持的数据结构:

  • strings
  • hashes
  • lists
  • sets
  • sorted sets with range queries
  • bitmaps
  • hyperloglogs
  • geospatial indexes
  • streams

redis支持主从同步和分片集群、支持数据持久化、支持lua脚本、LRU eviction、事物。

三、redis的资料

1. redis官网

2. redis命令

2.1中文版

3. SDK

4. 文档

4.1 acl配置规则

4.2 配置文件

4.3 下载

四、redis搭建(单节点)

1. 安装依赖包

下载的是最新稳定版本,如果需要非最新版,则可以从官网下载指定版本。

yum -y install gcc

yum -y install libc

2. 下载安装redis

下载的是最新稳定版本,如果需要非最新版,则可以从官网下载指定版本。

cd /opt; 
mkdir /opt/redis/;
wget http://download.redis.io/redis-stable.tar.gz;
tar xvzf redis-stable.tar.gz;
cd redis-stable;
make

3. 启动3.1

拷贝命令和配置文件

cp src/redis-server src/redis-cli src/redis-sentinel src/redis-benchmark src/redis-check-aof src/redis-check-rdb /opt/redis; 
cp redis.conf /opt/redis;

3.2 修改配置文件

daemonize no 修改为 daemonize yes;
bind 127.0.0.1 -::1 修改为 bind 0.0.0.0; #需要使用vip6的,则把ipv6地址加上即可。

3.3 启动redis

/opt/redis/redis-server /opt/redis/redis.conf;

4. 安装完成后的命令

命令在解压后的redis目录的src目录下面。

  • redis-server is the Redis Server itself.
  • redis-sentinel is the Redis Sentinel executable (monitoring and failover).
  • redis-cli is the command line interface utility to talk with Redis.
  • redis-benchmark is used to check Redis performances.
  • redis-check-aof and redis-check-rdb (redis-check-dump in 3.0 and below) are useful in the rare event of corrupted data files.

5. redis配置文件

1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
    daemonize no

2. 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
    pidfile /var/run/redis.pid

3. 指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字
    port 6379

4. 绑定的主机地址
    bind 127.0.0.1

5.当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
    timeout 300

6. 指定日志记录级别,Redis总共支e持四个级别:debug、verbose、notice、warning,默认为verbose
    loglevel verbose

7. 日志记录方式,默|认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
    logfile stdout

8. 设置数据库的数量,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id
    databases 16

9. 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
    save <seconds> <changes>
    Redis默认配置文件中提供了三个条件:
    save 900 1
    save 300 10
    save 60 10000
    分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。
 
10. 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
    rdbcompression yes

11. 指定本地数据库文件名,默认值为dump.rdb
    dbfilename dump.rdb

12. 指定本地数据库存放目录
    dir ./

13. 设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
    slaveof <masterip> <masterport>      #旧版命令
    replicaof <masterip> <masterport>    #新版命令

14. 当master服务设置了密码保护时,slav服务连接master的密码
    masterauth <master-password>

15. 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭
    requirepass foobared

16. 设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息
    maxclients 128

17. 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
    maxmemory <bytes>

18. 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
    appendonly no

19. 指定更新日志文件名,默认为appendonly.aof
     appendfilename appendonly.aof

20. 指定更新日志条件,共有3个可选值: 
    no:表示等操作系统进行数据缓存同步到磁盘(快) 
    always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全) 
    everysec:表示每秒同步一次(折衷,默认值)
    appendfsync everysec
 
21. 指定是否启用虚拟内存机制,默认值为no,简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析Redis的VM机制)
     vm-enabled no

五、客户端测试连接

1 连接redis服务器

/opt/redis/redis-cli -h 127.0.0.1 -p 6379 # 对于配置了acl的redis登陆。

redis-cli --user xxx  --pass yyy


4.2 进入redis交互后

info #查看redis信息


4.3 查看redis客户端工具用法

/opt/redis/redis-cli --help

六、常用命令(摘自王义凯_Rick博客)

1 查看当前redis中所有可用命令

127.0.0.1:6379> command

1.1 使用command count命令查看当前Redis中命令的数量

127.0.0.1:6379>command count 

1.2 使用command info命令查看当前Redis中指定的命令的详细信息:

127.0.0.1:6379> COMMAND INFO get
1) 1) "get"
   2) (integer) 2
   3) 1) readonly
      2) fast
   4) (integer) 1
   5) (integer) 1
   6) (integer) 1
   7) 1) @read
      2) @string
      3) @fast

2 服务连接

2.1 连接redis

  • -h 指定redis服务主机,默认为当前服务器。
  • -p 指定端口,默认为6379
  • -a 指定密码,默认无密码
  • -u 指定用户。6.0版本新增了acl权限控制,如果配置了用户名和密码则使用此登陆。
# 连接成功
[root@localhost redis]# ./redis-cli -h 192.168.1.1 -p 6379 -a password
127.0.0.1:6379> 

# 连接失败
[root@localhost redis]# ./redis-cli -h 192.168.1.1 -p 6379 -a password
Could not connect to Redis at 127.0.0.1:6389: Connection refused
not connected> 

2.2 验证redis服务是否正常

使用PING命令,返回PONG,则代表redis服务正常。

127.0.0.1:6379> PING
PONG

3 查看服务器信息

使用info明林可以查看redis服务的信息,里面有以下的信息(详细信息没有摘录)。

127.0.0.1:6379> info
# Server
# Clients
# Memory
# Persistence
# Stats
# Replication
# CPU
# Modules
# Errorstats
# Cluster
# Keyspace

也可以使用info xx来查看指定的某个内容,比如info server查看服务的内容。

127.0.0.1:6379> info server
# Server
redis_version:6.2.6
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:7b38e6eb6ac5051f
redis_mode:standalone
os:Linux 3.10.0-862.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:4.8.5
process_id:9580
process_supervised:no
run_id:b05097542fe9c9cdd9c0f394c1723c7997c0eab8
tcp_port:6379
server_time_usec:1636944465254864
uptime_in_seconds:323693
uptime_in_days:3
hz:10
configured_hz:10
lru_clock:9554513
executable:/opt/redis/redis-server
config_file:/opt/redis/redis.conf
io_threads_active:0

4 常用key命令

查看所有key

keys *   #线上不要使用,会影响性能

查看key的类型

type key

随机返回一个key

randomkey

删除key

返回删除状态1/0,True/False:

del key [key2 key3 key4...]

过期策略

给指定的 key 设置过期时间,以或unix timestamp为单位:

expire key seconds
expireat key timestamp 

移除 key 的过期时间,key 将持久保持:

persist key

为单位,返回给定 key 的剩余生存时间(TTL, time to live):

ttl key

毫秒为单位返回 key 的剩余生存时间

pttl key

统计key的数量

127.0.0.1:6379> dbsize (integer) 2 
127.0.0.1:6379> keys * 1) "xxx" 2) "test" 

5 配置相关

5.1 查看配置信息

127.0.0.1:6379> config get port  #查看端口
1) "port"
2) "6379"
127.0.0.1:6379> config get max*   #查看max开头的配置项
 1) "maxmemory-policy"
 2) "noeviction"
 3) "maxmemory-samples"
 4) "5"
 5) "maxmemory-eviction-tenacity"
 6) "10"
 7) "maxclients"
 8) "10000"
 9) "maxmemory"
10) "0"
127.0.0.1:6379> config get *     #查看所有配置
  1) "rdbchecksum"
  2) "yes"


5.2 修改配置

命令格式

config set parameter value

使用config set命令可以动态调整redis服务器的配置。修改后,可以使用config rewrite命令将新的配置写入配置文件,这样下次启动,就是新配置了,否则会是旧配置。

[root@localhost redis]# ./redis-cli -p 6379
127.0.0.1:6379> config get slowlog-max-len           # 查看slowlog-max-len参数值
1) "slowlog-max-len"
2) "128"
127.0.0.1:6379> config set slowlog-max-len 256       # 设置slowlog-max-len参数值
OK
127.0.0.1:6379> config get slowlog-max-len           # 查看slowlog-max-len参数值,可以看到已经是新的配置。
1) "slowlog-max-len"
2) "256"
127.0.0.1:6379> exit
[root@localhost redis]# ./redis-cli -p 6379          # 查看slowlog-max-len参数值,重新连接也是新的配置。
127.0.0.1:6379> config get slowlog-max-len
1) "slowlog-max-len"
2) "256"
127.0.0.1:6379> config rewrite                       # 将修改的配置写入配置文件。
OK
127.0.0.1:6379> 
[root@localhost redis]# cat redis.conf |grep -v '#'|grep slowlog-max-len  # 查看配置文件,可以配置文件记录的是新的配置值。
slowlog-max-len 256

6 重置统计信息

使用Config Resetstat 命令重置 INFO 命令中的某些统计数据,包括:

  • Keyspace hits (键空间命中次数)
  • Keyspace misses (键空间不命中次数)
  • Number of commands processed (执行命令的次数)
  • Number of connections received (连接服务器的次数)
  • Number of expired keys (过期key的数量)
  • Number of rejected connections (被拒绝的连接数量)
  • Latest fork(2) time(最后执行 fork(2) 的时间)
  • The aof_delayed_fsync counter(aof_delayed_fsync 计数器的值)
127.0.0.1:6379> CONFIG RESETSTAT OK

7 切换数据库

redis共有16个db,从db0~db15,使用select index命令在数据库之间进行切换:

127.0.0.1:6379> select 0 OK

8 获取当前时间

Time 命令用于返回当前服务器时间,返回一个包含两个字符串的列表: 第一个字符串是当前时间(以 UNIX 时间戳格式表示),而第二个字符串是当前这一秒钟已经逝去的微秒数。

127.0.0.1:6379> time 1) "1636946890" 2) "276444"

9 DEBUG

debug object key获取 key 的调试信息,当key不存在时返回错误信息。

debug segfault 命令执行一个非法的内存访问从而让 Redis 崩溃,仅在开发时用于 BUG 调试,执行后需要重启服务。

127.0.0.1:6379> debug object xxx
Value at:0x7f625540e720 refcount:1 encoding:embstr serializedlength:6 lru:9230820 lru_seconds_idle:326146

127.0.0.1:6379>debug segfault 

10 数据持久化

异步AOF重写

执行一个异步的AOF(append only file)文件重写。

127.0.0.1:6379>BGREWRITEAOF

同步RDB持久化数据到磁盘

同步地将redis中的数据持久化到磁盘:

127.0.0.1:6379>save

异步RDB持久化数据到磁盘

异步将redis中的数据持久化到磁盘:

127.0.0.1:6379>BGSAVE

查看上次RDB持久化时间

使用lastsave命令查看上次持久化到磁盘的时间:

127.0.0.1:6379>lastsave

11清空库

flushdb清空当前数据库下的所有数据。

flushall清空所有库下的所有数据。

127.0.0.1:6379> flushdb
(error) READONLY You can't write against a read only replica.

127.0.0.1:6379> flushall
(error) READONLY You can't write against a read only replica.   # 因为在从库执行的,所以不允许

12 监控

monitor命令用于监听redis服务器接收到的所有命令:

127.0.0.1:6379> monitor
OK
1636947155.606965 [0 192.168.2.151:39364] "PING"
1636947155.692873 [0 192.168.2.152:52732] "PUBLISH" "__sentinel__:hello" "192.168.2.152,26379,14e490939d4b0e10b96ad05e4d8837e2b5720137,3,mymaster,192.168.2.154,6379,3"
1636947155.810139 [0 192.168.2.151:39364] "PUBLISH" "__sentinel__:hello" "192.168.2.151,26379,abc469e9b9b952ab8c8f9ab9a502ed92fbcd8d23,3,mymaster,192.168.2.154,6379,3"
1636947155.810524 [0 192.168.2.154:6379] "PUBLISH" "__sentinel__:hello" "192.168.2.151,26379,abc469e9b9b952ab8c8f9ab9a502ed92fbcd8d23,3,mymaster,192.168.2.154,6379,3"

13 关闭服务器

异步的将数据持久化到磁盘后关闭服务器:

127.0.0.1:6379>SHUTDOWN [NOSAVE|SAVE]
Previous Post

人最要的核心是什么?

Next Post

二、redis高可用

Related Posts