文章目录
一、Redis简介
1.Redis概述
- Redis是一个开源的、使用c语言编写的NosQL数据库。
- Redis基于内存运行并支持持久化(支持存储在磁盘),采用key-value(键值对)的存储形式,是目前分布式架构中不可或缺的一环
Redis服务器程序默认是单进程模型
- Redis服务在一台服务器上可以同时启动多个Redis进程,Redis的实际处理速度则是完全依靠于主进程的执行效率
开双进程的好处
- 备份
- 抗高并发的同时尽量不给CPU造成太大的压力
2.Redis的优点
- 具有极高的数据读写速度
数据读取的速度最高可达到110000 次/s,数据写入速度最高可达到81000 次/s - 支持丰富的数据类型
支持key-value、 Strings、 Lists、Hashes ( 散列值)、Sets 及Ordered Sets等数据类型操作 - 支持数据的持久化
可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用 - 原子性
Redis所有操作都是原子性的:一起成功,一起失败 - 支持数据备份
即master-salve 模式的数据备份
3.常见应用场景
- 获取最新N个数据的操作
- 排行榜类应用
- 计数器应用
- 存储关系
- 实时分析系统
- 日志记录
二、Redis命令工具
命令 | 结果 |
---|---|
redis-server | 用于启动Redis的工具 |
redis-benchmark | 用于检测Redis在本机的运行效率 |
redis-check-aof | 修复AOF持久化文件 |
redis-check-rdb | 修复RDB持久化文件 |
redis-cli | Redis命令行工具 |
1.redis-benchmark 测试工具
redis-benchmark是官方自带的Redis性能测试工具,可以有效的测试Redis服务的性能
常用参数 | 含义 |
---|---|
-h | 指定服务器主机名 |
-p | 指定服务器端口 |
-s | 指定服务器socket (套接字) |
-c | 指定并发连接数 |
-n | 指定请求数 |
-d | 以字节的形式指定SET/GET8值的数据大小 |
-k | 1=keep alive 0=reconnect |
-r | SET/GET/ INCR使用随机key, SADD使用随机值 |
-P | 通过管道传输请求 |
-q | 强制退出redis。 仅显示query/sec值 |
–csv | 以csv格式输出 |
-1 | 生成循环,永久执行测试 |
-t | 仅运行以逗号分隔的测试命令列表 |
-I | Idle模式。 仅打开N个idle连接并等待 |
2.redis-cli 远程登录的命令行工具
redis-cli的全程即redis-client,表示以客户端的身份登录
常用参数 | 含义 |
---|---|
-h | 指定远程主机 |
-p | 指定Redis服务的端口号 |
-a | 指定密码,未设置数据库密码可以省略-a选项 |
3.redis-check-aof 和 redis-check-rdb
aof和rdb是redis服务中持久化功能的两种形式AOF、RDB
三、部署Redis
1.安装依赖包
[root@localhost ~]# yum -y install gcc gcc-c++ make
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
软件包 gcc-4.8.5-44.el7.x86_64 已安装并且是最新版本
软件包 gcc-c++-4.8.5-44.el7.x86_64 已安装并且是最新版本
软件包 1:make-3.82-24.el7.x86_64 已安装并且是最新版本
无须任何处理
[root@localhost ~]#
2.解压并安装
[root@localhost redis-5.0.7]# make && make PREFIX=/usr/local/redis install
[root@localhost utils]# ./install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379]
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf]
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log]
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379]
Selected default - /var/lib/redis/6379
Please select the redis executable path [] /usr/local/redis/bin/redis-server
Selected config:
Port : 6379 //默认监听端口
Config file : /etc/redis/6379.conf //配置文件路径
Log file : /var/log/redis_6379.log //日志文件路径
Data dir : /var/lib/redis/6379 //数据文件路径
Executable : /usr/local/redis/bin/redis-server //可执行文件路径
Cli Executable : /usr/local/redis/bin/redis-cli //客户端命令工具
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
[root@localhost utils]#
[root@localhost utils]# ln -s /usr/local/redis/bin/* /usr/local/bin/ //优化管理
3.修改配置文件
[root@localhost utils]# vim /etc/redis/6379.conf
bind 127.0.0.1 192.168.30.7 //添加监听IP
port 6379 //默认监听端口
daemonize yes //开启守护进程
pidfile /var/run/redis_6379.pid //指定PID文件
loglevel notice //指定日志级别
logfile /var/log/redis_6379.log //指定日志文件
4.重启服务
[root@localhost utils]# /etc/init.d/redis_6379 restart
Stopping ...
Redis stopped
Starting Redis server...
[root@localhost utils]#
四、Redis数据库常用命令
1.存放和获取数据
set :存放数据 set key value
get :获取数据 get key
127.0.0.1:6379> keys * //查看数据库中所有键
(empty list or set)
127.0.0.1:6379> set k1 1 //设置k1键值为1
OK
127.0.0.1:6379> set k11 2
OK
127.0.0.1:6379> set v1 1
OK
127.0.0.1:6379> set v11 2
OK
127.0.0.1:6379> keys *
1) "v11"
2) "k11"
3) "k1"
4) "v1"
127.0.0.1:6379> get k1 //获取k1的键值
"1"
127.0.0.1:6379> get k2
(nil)
127.0.0.1:6379> get v1
"1"
127.0.0.1:6379> get v11
"2"
127.0.0.1:6379> keys k* //获取以k开头的键
1) "k11"
2) "k1"
127.0.0.1:6379> keys k? //获取以k开头,包含任意一位的键
1) "k1"
2.重命名
rename 源key 目标key 无论目标key是否存在都会进行重命名并覆盖
renamenx 源key 目标key 目标key存在则取消重命名
127.0.0.1:6379> rename k1 k2 //k2不存在
OK
127.0.0.1:6379> get k1
(nil)
127.0.0.1:6379> get k2
"1"
127.0.0.1:6379> renamenx k2 k11 //k11存在
(integer) 0
127.0.0.1:6379> get k2
"1"
127.0.0.1:6379> get k11
"2"
127.0.0.1:6379>
3.判断键值是否存在,键值类型
127.0.0.1:6379> exists k1 //0表示不存在
(integer) 0
127.0.0.1:6379> exists k2 //1表示存在
(integer) 1
127.0.0.1:6379> type k2 //string类型
string
4.查看当前数据库的key的数目
127.0.0.1:6379> dbsize
(integer) 4
127.0.0.1:6379> keys *
1) "k11"
2) "v11"
3) "k2"
4) "v1"
5.多数据库切换
默认情况下只包含16个数据库
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
(empty list or set)
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> keys *
1) "k11"
2) "v11"
3) "k2"
4) "v1"
127.0.0.1:6379> select 15
OK
127.0.0.1:6379[15]> keys *
(empty list or set)
127.0.0.1:6379[15]> select 16
(error) ERR DB index is out of range
127.0.0.1:6379[15]>
6.多数据库间移动数据
格式 move 键值 数据库序号
127.0.0.1:6379> select 1 //切换至数据库1
OK
127.0.0.1:6379[1]> keys * //无数据
(empty list or set)
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> move v1 1 //移动到1
(integer) 1
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys * //数据存在
1) "v1"
127.0.0.1:6379[1]>
7.清空数据库数据
127.0.0.1:6379[1]> flushdb //清空当前数据库数据
OK
127.0.0.1:6379[1]> keys *
(empty list or set)
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> keys *
1) "k11"
2) "v11"
3) "k2"
127.0.0.1:6379> flushall //清空所有库数据,慎用
OK
127.0.0.1:6379> keys *
(empty list or set)
五、性能管理
1.查看内存使用
127.0.0.1:6379> info memory
# Memory
used_memory:853328
used_memory_human:833.33K
used_memory_rss:10747904
used_memory_rss_human:10.25M
used_memory_peak:853328
used_memory_peak_human:833.33K
used_memory_peak_perc:100.01%
used_memory_overhead:841102
used_memory_startup:791408
used_memory_dataset:12226
used_memory_dataset_perc:19.74%
allocator_allocated:1433688
allocator_active:1859584
allocator_resident:8970240
total_system_memory:3954188288
total_system_memory_human:3.68G
used_memory_lua:37888
used_memory_lua_human:37.00K
used_memory_scripts:0
used_memory_scripts_human:0B
number_of_cached_scripts:0
2.内存碎片率
操作系统分配的内存值used_memory_rss除以Redis使用的内存值used_memory计算得出内存碎片是由操作系统低效的分配/回收物理内存导致的(不连续的物理内存分配)
跟踪内存碎片率对理解Redis实例的资源性能是非常重要的:
- 内存碎片率稍大于1是合理的,这个值表示内存碎片率比较低
- 内存碎片率超过1.5,说明Redis消耗了实际需要物理内存的150号,其中50号是内存碎片率。需要在redis-cli工具上输入shutdown save命令,并重启Redis服务器。
- 内存碎片率低于1的,说明Redis内存分配超出了物理内存,操作系统正在进行内存交换。需要增加可用物理内存或减少Redis内存占用
3.内存使用率
redis实例的内存使用率超过可用最大内存,操作系统将开始进行内存与swap空间交换
避免内存交换发生的方法:
- 针对缓存数据大小选择安装Redis实例(云平台里面使用RDS服务,ECS云主机选择内存、缓存型配置)
- 尽可能的使用Hash数据结构存储
- 设置key的过期时间
4.内回收key
保证合理分配redis有限的内存资源。
当达到设置的最大阀值时,需选择–种key的回收策略,默认情况下回收策略是禁止删除。
配置文件中修改maxmemory- policy属性值
vim /etc/redis/6379.conf
598 maxmemory-policy noenviction
volatile-lru //使用LRU算法从已设置过期时间的数据集合中淘汰数据
volatile-ttl //从已设置过期时间的数据集合中挑选即将过期的数据淘汰
volatile-random //从已设置过期时间的数据集合中随机挑选数据淘汰
allkeys-lru //使用LRU算法从所有数据集合中淘汰数据
allkeys-random //从数据集合中任意选择数据淘汰
noenviction //禁止淘汰数据
小结
redis是一种非关系型数据库(内存/缓存)
redis相比于其他非关数据库优势在于:
①数据类型丰富
②持久化(redis重启时,会进行数据恢复)