一、Redis
-
Redis基于内存运行并支持持久化
-
采用key-value(键值对)的存储形式
-
Redis的优点:
具有极高的数据读写速度
支持丰富的数据类型
支持数据的持久化
原子性
支持数据备份
-
redis(remote dictionary server,远程字典服务)是一个开源的使用ANSI C语言编写、遵守BSD协议,支持网络,可基于内存可持久化的日志型、key-Value的数据库,并提供多种语言的API。它通常被称为结构服务器,因为值(value)可以是字符串(string),哈希(hash),列表(list),集合(sets)和有序集合(sorted sets)等类型
-
redis是完全开源免费的,是一个高性能的key-value数据库
-
redis与其他key-value的不同
redis有着更为复杂的数据结构并且提供对他们的原子操作,这是一个不同于其他数据库的进化路径。redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象
redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据不能大于硬件内存。在内存数据库方面的另外一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式生产的,因为他们不需要进行随机访问
1.1Redis多数据库操作
- Redis支持多数据库,默认支持16个数据库,0-15命名
- 多数据库相互独立,互不干扰
- 多数据库常用命令:
多数据库间切换
多数据库间移动数据
清除数据库内数据
1.2Redis持久化
1.2.1 概述
- Redis是运行在内存中,内存中的数据断电丢失
- 为了能够重用Redis数据,或者防止系统故障,需要将Redis中的数据写入到磁盘空间中,即持久化
1.2.2 分类
- RDB方式:
创建快照的方式获取某一时刻Redis中所有数据的副本 - AOF方式:
将执行的写命令写到文件的末尾,以日志的方式来记录数据的变化
RDB持久化
- RDB是Redis的默认持久化方式
- 默认文件名dump.rdb
- 触发条件
在指定的时间间隔内,执行指定次数的写操作(配置文件控制)
执行save或者是bgsave(异步)命令
执行flush命令,清空数据库所有数据
执行shutdown命令,保证服务器正常关闭且不丢失任何数据
- 优缺点
适合大规模的数据恢复
如果业务对数据完整性和一致性要求不高,RDB是很好的选择
数据的完整性和一致性不高
备份时占用内存
AOF持久化
-
Redis默认不开启
-
弥补RDB的不足(数据的不一致性)
-
采用日志的形式来记录每个写操作,并追加到文件中
-
Redis重启会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
-
根据AOF文件恢复数据
-
将appendonly.aof文件拷贝到Redis的安装目录的bin目录下,重启Redis服务即可
-
AOF的重写机制
AOF的工作原理是将写操作追加到文件中,文件的冗余内容会越来越多
当AOF文件的大小超过所设定的阈值时,Redis就会对AOF文件的内容压缩
- AOF重写的原理
Redis会fork出一条新进程,读取内存中的数据(并没有读取旧文件),并重新写到一个临时文件中,最后替换旧的aof文件
1.3:Redis性能管理
查看Redis内存使用
[root@master1~]# /usr/localredis/bin/redis-cli
127.0.0.1:6379>info memory
-
内存碎片率
-
操作系统分配的内存值used_memory_rss除以Redis使用的内存值used_memory计算得出
-
内存碎片是由操作系统低效的分配/回收物理内存导致的
- 不连续的物理内存分配 -
跟踪内存碎片率对理解Redis实例的资源性能是非常重要的
内存碎片率稍大于1是合理的,这个值表示内存碎片率比较低
内存碎片率超过1.5,说明Redis消耗了实际需要物理内存的150%,其中50%是内存碎片率
内存碎片率低于1的,说明Redis内存分配超出了物理内存,操作系统正在进行内存交换
-
内存使用率
- redis实例的内存使用率超过可用最大内存,操作系统将开始进行内存与swap空间交换
- 避免内存交换
- 针对缓存数据大小选择
- 尽可能的使用Hash数据结构
- 设置key的过期时间
-
回收key
-
保证合理分配redis有限的内存资源
-
当达到设置的最大阀值时,需选择一种key的回收策略
-
默认情况下回收策略是禁止删除
redis.conf配置文件中修改maxmemory-policy属性值
volatile-lru:使用LRU算法从已设置过期时间的数据集合中淘汰数
volatile-ttl:从已设置过期时间的数据集合中挑选即将过期的数据
volatile-random:从已设置过期时间的数据集合中随机挑选数据淘汰
allkeys-Iru:使用LRU算法从所有数据集合中淘汰数据
allkeys-random:从数据集合中任意选择数据淘汰
no-enviction:禁止淘汰数据
二、redis部署实操
首先关闭防火墙与核心防护
- 部署环境
[root@localhost ~]# yum -y install gcc gcc-c++ make
2.拷贝redis-5.0.7.tar.gz 到opt目录下
[root@localhost ~]#cd /opt
[root@localhost opt]# tar zxvf redis-5.0.7.tar.gz
3.编译安装
[root@redis opt]#cd redis-5.0.7/
[root@redis redis-5.0.7]#make
[root@redis redis-5.0.7]#make PREFIX=/usr/local/redis install
4.优化,创建软连接
[root@redis redis-5.0.7]#ln -s /usr/local/redis/bin/* /usr/local/bin
[root@redis redis-5.0.7]#cd utils/
[root@redis utils]#./install_server.sh //启动
[root@redis utils]#/etc/init.d/redis_6379 status
[root@redis utils]#/etc/init.d/redis_6379 stop
[root@kibana utils]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@kibana utils]# netstat -antp | grep redis
tcp 0 0 20.0.0.103:6379 0.0.0.0:* LISTEN 66550/redis-server
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 66550/redis-server
5.修改配置文件
vim /etc/redis/6379.conf //修改配置文件
找到bind 在本地后面添加绑定本机IP
6.数据库操作
[root@kibana utils]# redis-cli -h 20.0.0.103 -p 6379 //-p指定端口,-h指定地址
20.0.0.103:6379> keys *
1) "name"
20.0.0.103:6379> hmset stu name lisi age 18 sex 男 //存放数据
OK
20.0.0.103:6379> hget stu name //获取数据
"lisi"
20.0.0.103:6379> hget stu age
"18"
20.0.0.103:6379> hget stu sex //由于sex是后面是中文,不识别,显示乱码
"\xe7\x94\xb7"
- hash(哈希)结构:
redis hash 是一个键值对集合(key =》value)
hash是一个string类型的field和value的映射表,hash特别适合用于存储对象
每个hash可以存储2的32次方 -1键值对
适用场景:
键值对集合,即对编程语言的map类型适合存储对象,可以像数据库中update一个属性一样只修改某一项属性。
[root@redis utils]# redis-cli -h 20.0.0.103 -p 6379 --raw //raw 中文字符集解决乱码
20.0.0.103:6379> hget stu sex
男
[root@redis utils]# redis-cli -h 20.0.0.103 -p 6379 --raw
20.0.0.103:6379> keys * //查询键名
name
stu
20.0.0.103:6379> type stu //stu采用类型hash
hash
20.0.0.103:6379> type name //name采用类型string
string
- list列表结构 (可以存重复数据,但集合不允许)
redis列表是简单的字符串列表,按照插入顺序排序,可以重复,可以添加一个元素到列表的头部(左)或者尾部。
作用场景:
增删快,提供了操作某一段元素的API
20.0.0.103:6379> lpush hobby play
1
20.0.0.103:6379> lpush hobby sport
2
20.0.0.103:6379> lpush hobby read
3
20.0.0.103:6379> lrange hobby 0 10
read
sport
play
20.0.0.103:6379> type hobby //hobby采用类型list
list
20.0.0.103:6379> lrange hobby 0 0 //最后一个存入,第一个被拉取
read
20.0.0.103:6379> lrange hobby 0 1
read
sport
20.0.0.103:6379> lrange hobby 0 3
read
sport
play
- set集合
redis 的set 是string类型的无序集合
集合是通过hash表实现的。所以添加、删除、查找的复杂难度都是0(1).
作用场景:
1 共同好友
2 利用唯一性,统计访问网站的所有独立IP
3 好友推荐时,根据tag 求交集,大于某个阈值就可以推荐
- sadd命令
添加一个string元素到key对应的set集合中,成功返回1,如果元素已经子啊集合中返回0
[root@redis utils]# redis-cli -h 20.0.0.103 -p 6379 --raw
20.0.0.103:6379> sadd color red yellow blue
3
20.0.0.103:6379> smembers color //返回color集合中的所有成员
yellow
red
blue
20.0.0.103:6379> sadd color green //添加green到color集合中
1
20.0.0.103:6379> sadd color green //返回值为0 不能重复添加
0
- zset(sorted set:有序集合)
redis zset 和set一样也是string类型元素的集合,且不允许重复的成员
不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序
zset的成员是唯一的,但分数(score)却可以重复
- 作用场景:
将set中的元素增加一个权重参数score,元素按score有序排列
数据插入集合时,已经进行天然排序 1.排行榜 2.带权重的消息队列
- zadd命令:
添加元素到集合,元素在集合中存在则更新对应score
20.0.0.103:6379> zadd bb 1 green
(integer) 1
20.0.0.103:6379> zadd bb 0 red
(integer) 1
20.0.0.103:6379> zadd bb 2 wang
(integer) 1
20.0.0.103:6379> zadd bb 3 sha
(integer) 1
20.0.0.103:6379> zadd bb 3 xia
(integer) 1
20.0.0.103:6379> ZRANGEBYSCORE bb 0 1
1) "red"
2) "green"
20.0.0.103:6379> ZRANGEBYSCORE bb 0 0
1) "red"
20.0.0.103:6379> ZRANGEBYSCORE bb 2 3
1) "wang"
2) "sha"
3) "xia"
20.0.0.103:6379> type bb //有序集合
zset
- string(字符串)
string时redis最基本的类型,你可以理解成与memcached一模一样的类型,一个key对应一个value
string类型是二进制安全的,redis的string可以包含任何数据,比如jpg图片或者系列化的对象。
string类型是redis最基本的数据类型,string类型的值最大能存储512MB
20.0.0.103:6379> set nam zhangsan
OK
20.0.0.103:6379> expire nam 20 //20秒后键名失效
(integer) 1
三、补充
- 配置参数
bind:监听的主机地址
port:端口
daemonize yes:启用守护进程
pidfile:指定PID文件
loglevel notice:日志级别
logfile:指定日志文件
- key相关
keys:获取符号规则的键值列表
exists:判断键值是否存在
del:删除当前数据库的指定key
type:获取key对应的value值类型
rename(覆盖)/renamenx(不覆盖):对已有的key进行重命名
dbsize:查看当前数据库中key的数目
- Redis-benchmark测试工具
-h:指定服务器主机名
-p:指定服务器端口
-c:指定请求数
-d:以字节的形式指定set/get值的数据大小
-q:强制退出Redis,仅显示query/sec值