一、redis的概述
redis是一种基于键值对的nosql数据库,redis的值可以是由string、hash、list、set、zset(有序集合)、bitmaps(位图)、HyperLogLog、Geo(地理信息定位)等多种数据结构和算法组成,redis的所有数据都存放在内存中,读写速率很高。并且redis还可以将内存的数据利用内存和快照的形式保存到硬盘上。
1、redis的特性
(1)速度快
数据存放在内存中、redis由c语言编写、redis使用单线程架构
(2)基于键值对的数据结构服务器
提供了字符串、哈希、列表、集合、有序集合等五种数据结构、并在字符串的基础上演变出了位图和HyperLogLog两种数据结构。
(3)功能丰富
键过期功能、可以用来实现缓存
发布订阅功能、可实现消息队列功能
支持lua脚本功能、可创造出新的redis命令
提供了简单事物功能、在一定程度上保证了事务特性
提供了流水线(Pipeline)功能、减少了网络开销
(4)简单稳定
不需要依赖于操作系统的类库
(5)客户端语言多
提供了简单的TCP通信协议,主流的变成语言都支持。
(6)持久化
有RDB和AOF两种持久化的方式
(7)主从复制
一个主服务器可以有多个复制的副本
(8)高可用和分布式
2.8版本提供了高可用性实现Redis Sentinel,3.0版本提供了分布式实现Redis Cluster
2、redis的使用场景
(1)缓存
(2)排行榜系统
(3)计数器应用
(4)消息队列
(5)消息队列系统
3、redis的发布版本
Redis版本命名规则参照Linux内核命名规则,版本号第二位为奇数则为非稳定版本,为偶数则为稳定版本。
Redis主要版本:
(1)Redis 2.6
2012年发布,增加的主要功能有服务端支持Lua脚本,去掉虚拟内存相关功能、放开客户端连接数硬编码的限制、重构大量核心代码
(2)Redis 2.8
2013年11月发布,增加的主要功能有:添加部分主从复制的功能、尝试性支持ipv6、可通过config set命令设置maxclients、可以绑定过个ip、设置明显进程号、正式启用Redis sentinel。
(3)Redis 3.0
2015年4月发布,增加的主要功能有:redis分布式的实现、优化小内存访问、lru算法提升、migrate连接缓存大幅提升键迁移速度
(4)Redis 3.2
2016年5月发布,增加的主要功能有:添加GEO相关功能、SDS在速度和节省空间上做了变化、支持用upstart或者systemd管理redis进程。新的list编码类型quicklist、优化了Redis崩溃后的相关报告。
(5)Redis 4.0
Redis4.0的新特性:提供了模块系统方便第三方开发者拓展redis的功能,优化了之前版本中主切换引起全量复制的问题、提供了新的缓存提出算法、提供非阻塞del和flushall/flushdb功能、提供了ADB-AOF混合持久化格式、提供了交互数据库功能,redis cluster兼容NAT和docker。
二、redis的安装
1、redis的安装
#安装gcc编译软件
]# yum -y install gcc
#下载并解压缩redis安装包
]# wget http://download.redis.io/releases/redis-3.2.12.tar.gz
]# tar -xf redis-3.2.12.tar.gz
]# cd redis-3.2.12
#编译并安装redis
]# make
]# make install
#进入redisunils目录使用脚本快速设置redis
]# cd utils/
]# ./install_server.sh
2、redis基本配置
(1)修改让redis启动后在后台运行
Redis安装完成后再启动redis是默认会在前台运行,需要修改配置文件中的daemonize yes为daemonize no
(2)修改redis绑定的网卡地址
修改配置文件中的bind,多个地址可以空格隔开,绑定本地全部地址使用0.0.0.0
(3)port
port用于指定redis启动时的端口
(4)logfile
指定redis日志文件存放位置
(5)dir
指定redis的存放持久化文件的位置。
修改redis的配置可以通过修改配置文件修改,也可以在redis中通过命令的方式修改。
3、redis的启动与停止
(1)启动redis
1)使用默认配置启动redis,如果运行了快速设置脚本也可以通过service服务启动
#使用默认配置启动redis
]# redis-server
2)启动时设置加上修改的配文件
Redis-server –configkey1 configValue1 –configkey2 configVaule2
# 如启动时修改端口
]# redis-server –port 6666
3)通过制定配置文件启动redis
Redis-server /path/redis.conf
# 通过指定配置文件启动redis
]# redis-server /etc/redis/6379.conf
4)在centos7中将redis加入systemd中
在/lib/systemd/system目录下创建一个脚本文件redis.service
]# cat /lib/systemd/system/redis.service
[Unit]
Description=Redis
After=network.target
[Service]
ExecStart=/usr/local/bin/redis-server /usr/local/redis/redis.conf --daemonize no
ExecStop=/usr/local/bin/redis-cli -h 127.0.0.1 -p 6379 shutdown
[Install]
WantedBy=multi-user.target
将redis加入systemd管理
# 为刚才创建的脚本创建软连接,以方便系统初始化时自动启动服务,即将redis加入开机自启动。
]# ln -s /lib/systemd/system/redis.service /etc/systemd/system/multi-user.target.wants/redis.service
# 刷新配置,使刚加入的服务能被系统识别
]# systemctl daemon-reload
# 启动redis
]# systemctl start redis
(2)关闭redis
Redis关闭时建议使用shutdown命令关闭,也可以使用service以及systmctl命令关闭,执行方式如下
]# redis-cli shutdown
如果关闭时使用杀死进程的方法,可能会导致数据的丢失。
三、redis常用操作
1、redis-cli的使用
Redis-cli有很多参数,可以通过”redis-cli --help”命令查看,常用的参数有:
-r:将一个命令执行多次
-i:每个几秒执行一次命令
-x:从标准的输入读取数据作为redis-cli的最后一个参数
-c:连接redis cluster节点是使用
-a:输入密码时使用
--scan/--pattern:扫描指定的键,相当于scan命令
--save:获取当前redis节点的更新操作
--rdb:请求redis实例生成并发送RDB持久化文件,保存在本地
--pipe:将命令封装成redis通信协议定义的数据格式,批量发送给redis执行。
--bigkesy:使用scan命令对redis的键进行采样,从中找到内存占用大的键值。
--latency:用于检测网络延迟,有三个选项,分别为:
--latency:测试客户端到目标redis的网络延迟
--latency-history:以分时段的形式了解延迟信息
--latency-dist:使用统计图表形式从控制台输出延迟统计信息
--stat:实时获取redis的重要统计信息
--no-raw:返回原始的结果
--raw:返回格式化后的结果
2、redis-server的使用
除了启动redis外,还可以用来检测当前系统能否稳定的分配指定的内存给redis使用。
选项:--test-memory
# 检测当前系统能否分配512M内存给redis使用
[root@localhost ~]# redis-server --test-memory 512
3、redis-benchmark的使用
redis-benchmark可以为redis做基准性能的测试,如果在一个空的redis上执行redis-benchmark会创建三个键,常用的选项有:
-c:客户端的并发数量
-n:客户端的请求总量
-q:仅显示requests per second信息
# 对redis做压力测试,200个客户端同时请求redis,共请求20000次
[root@localhost ~]# redis-benchmark -c 200 -n 20000 -q
-r:配合前面参数,可以向redis插入更多的键
# 向redis插入更多的键,-r 10000代表只对key和count后四位做随机处理
[root@localhost ~]# redis-benchmark -c 100 -n 2000 -r 10000
-p:每个请求pipline的数据量
-k:客户端是否使用keepalive,1为使用,0为不使用,默认为1
-t:对指定命令做基准测试
--csv:将结果按照csv格式输出
四、redis的一些基本操作命令
在操作前先插入一些数据
127.0.0.1:6379> set name dayi123
OK
127.0.0.1:6379> set age 26
OK
127.0.0.1:6379> rpush aihao xiezi paobu kanshu luyou
(integer) 4
1、全量遍历键
命令:keys pattern
pattern使用的是glob风格的通配符
# 查看当前redis的多有键
127.0.0.1:6379> KEYS *
1) "aihao"
2) "age"
3) "name"
# 批量删除键
[root@localhost ~]# redis-cli keys name[0-9] | xargs redis-cli del
(integer) 2
2、查看键总数:dbsize
127.0.0.1:6379> DBSIZE
(integer) 3
Keys *会遍历所有的键,并将所有的键列出来,dbsize在计算键总数是不会遍历所有的键。在生产中,有大量的键时,查看键总数不建议使用keys *。
3、查看键是否存在:exists key
#检查存在的键时返回1
127.0.0.1:6379> EXISTS age
(integer) 1
#检查不存在的键时返回0
127.0.0.1:6379> EXISTS ages
(integer) 0
4、删除键:del key1 key2
#删除键时,可以同时删除多个键
127.0.0.1:6379> DEL age
(integer) 1
5、设置键过期
命令:expire key seconds
其他相关命令:
查看剩余时间:TTL key
PTTL key
取消键过期时间:PERSIST key
# 设置name 5秒后过期,过期后会自动删除
127.0.0.1:6379> EXPIRE name 20
(integer) 1
# 查看键的剩余过期时间
127.0.0.1:6379> ttl name
(integer) 2
# 使用pttl查看可以精确到毫秒级
127.0.0.1:6379> PTTL name
(integer) 15075
# 取消过期
127.0.0.1:6379> PERSIST name
(integer) 1
Redis不支持对列表、哈希等二级数据结构设置过期时间。
6、查看键的数据结构类型:type key
127.0.0.1:6379> TYPE name
string
127.0.0.1:6379> TYPE aihao
List
7、键重命名
命令:RENAME key newkey
RENAMENX key newkey
RENAME和RENAMENX的区别是如果newkey存在时,不会覆盖newkey。
127.0.0.1:6379> MGET name1 name2 name3 name4
1) "abc"
2) "def"
3) "123"
4) "456"
# 使用rename重名民name1为name2
127.0.0.1:6379> RENAME name1 name2
OK
# 使用namenx重命名name3为name4时失败
127.0.0.1:6379> RENAMENX name3 name4
(integer) 0
# 重新获取四个键的值
127.0.0.1:6379> MGET name1 name2 name3 name4
1) (nil)
2) "abc"
3) "123"
4) "456"
8、随机返回一个键
命令:RANDOMKEY
# 随机获取一个key
127.0.0.1:6379> RANDOMKEY
"name2"
9、迁移键
(1)使用move命令迁移
命令:MOVE key db
Move命令主要用于在redis内部对key进行库之间的迁移。
(2)使用dump+restore命令迁移
Dump+restore可以实现在不同的redis实例之间进行数据库的迁移,迁移分为两步:首先,在源redis上,dump命令会将键值序列化,格式采用的事RDB格式;在目标redis上,restore命令将dump命令序列化的值进行复原。命令格式分别如下:
DUMP key
RESTORE key ttl serialized-value [REPLACE]
参数:ttl代表过期时间,为0则表示不过期
# 在源redis上将键name序列化
[root@localhost ~]# redis-cli set name dayi123
OK
[root@localhost ~]# redis-cli dump name
"\x00\adayi123\a\x00>\xccK\xb2CP\xe5C"
# 在目标redis上将序列化复原
[root@localhost ~]# redis-cli -h 192.168.16.128
192.168.16.128:6379> RESTORE name 0 "\x00\adayi123\a\x00>\xccK\xb2CP\xe5C"
OK
192.168.16.128:6379> get name
"dayi123"
(3)使用migrate迁移
命令:MIGRATE host port key| destination-db timeout [COPY] [REPLACE] [KEYS key]
参数说明:
Host:目标redis地址
Port:目标redis端口
Key:需要迁移的键,如果迁移多个键,此处写””,命令最后写迁移的键名
destination-db:目标redis数据库(哪个库)
timeout:迁移超时时间
[COPY]:迁移后不删除源键
[REPLACE]:如果目标库存在此键则会覆盖
[KEYS key]:需要迁移的键
# 将当前redis的age键迁移至192.168.16.128并保留当前库的age键
127.0.0.1:6379> MIGRATE 192.168.16.128 6379 age 0 1000 copy replace
OK
127.0.0.1:6379> exit
[root@localhost ~]# redis-cli -h 192.168.16.128 get age
"26"
# 将当前redis的多个不同类型的键迁移至目标redis
127.0.0.1:6379> MIGRATE 192.168.16.128 6379 "" 0 1000 copy replace keys name1 name2 class:1 english
OK
[root@localhost ~]# redis-cli -h 192.168.16.128
192.168.16.128:6379> KEYS *
1) "age"
2) "english"
3) "name1"
4) "name"
5) "name2"
6) "class:1"
10、渐进式遍历
命令:SCAN cursor [MATCH pattern] [COUNT count]
参数:
Cursor:cursor是一个游标,第一次遍历从0开始,每次遍历都会返回游标值,游 标为0时表示遍历结束
MATCH pattern:做模式匹配
COUNT count:每次要遍历的键个数,默认是10
# 遍历所有以na开头的键,每次遍历3个
127.0.0.1:6379> SCAN 3 match na* count 2
1) "15"
2) 1) "name"
2) "name4"
除scan外,redis还提供了面向hash类型,集合类型,有序集合的扫描遍历命令,解决如hgetall、smembers、zrang可能产生阻塞的问题,对应的命令分别为hscan、sscan、zscan。
渐近式遍历可以有效的解决keys命令可能产生的阻塞问题。
11、redis数据库管理命令
(1)切换数据库
命令:SELECT index
Redis默认有16个数据库,用数字作为多个数据库的实例。
# 切换到第二个实例数据库
127.0.0.1:6379> SELECT 2
OK
127.0.0.1:6379[2]>
(2)清空数据库
命令:FLUSH/ FLUSHALL
flush用于清空当前数据库,flushall清空所有数据库。这两个命令在生产中慎用。