Redis配置
存储数据类型分类:
结构化数据:可以通过二维表格形式表述这个数据。
非结构化数据:不方便以二维表格形式表述的这种类型的数据。
根据不同种存储数据类型分类
结构化数据库(关系型数据库):里面存储的数据类型是结构化数据,例如:Oracle、MySQL、SQL Server、Microsoft Access
非结构化数据库(非关系型数据库):里面存储的数据类型是非结构化数据,例如:Redis、MongBD、Hbase、CouhDB等
Redis简介
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis数据类型
1.String(字符串)
string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
2.Hash(哈希)
Redis hash 是一个键值(key=>value)对集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
3.List(列表)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
4.Set(集合)
Redis 的 Set 是 string 类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
5.zset(sorted set:有序集合)
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
各数据类型应用场景:
类型 | 简介 | 特性 | 场景 |
---|---|---|---|
String(字符串) | 二进制安全 | 可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M | — |
Hash(字典) | 键值对集合,即编程语言中的Map类型 | 适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去) | 存储、读取、修改用户属性 |
List(列表) | 链表(双向链表) | 增删快,提供了操作某一段元素的API | 1,最新消息排行等功能(比如朋友圈的时间线) 2,消息队列 |
Set(集合) | 哈希表实现,元素不重复 | 添加、删除,查找的复杂度都是O(1) 2、为集合提供了求交集、并集、差集等操作 | 1、共同好友 2、利用唯一性,统计访问网站的所有独立ip 3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐 |
Sorted | 将Set中的元素增加 | 数据插入集合时,已经进行天然排序 | 1、排行榜 2、带权重的消息队列 |
redis部署配置
编译安装redis
[root@squid ~]# yum -y install gcc gcc-c++ make
[root@squid ~]# tar zxf redis-5.0.4.tar.gz
[root@squid redis-5.0.4]# make
[root@squid redis-5.0.4]# make PREFIX=/usr/local/redis install
执行redis安装脚本进行配置
[root@squid redis-5.0.4]# ln -s /usr/local/redis/bin/* /usr/local/bin
[root@squid redis-5.0.4]# cd utils/
[root@squid 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/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/bin/redis-server
Cli Executable : /usr/local/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@squid utils]# vi /etc/redis/6379.conf
修改: bind 127.0.0.1 192.168.100.10 ###把允许登录的地址加到配置文件的bind后面
[root@squid utils]# /etc/init.d/redis_6379 restart
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...
[root@squid utils]# netstat -lutap | grep 6379
tcp 0 0 squid:6379 0.0.0.0:* LISTEN 22893/redis-server
tcp 0 0 localhost:6379 0.0.0.0:* LISTEN 22893/redis-server
tcp 0 0 localhost:6379 localhost:51134 TIME_WAIT -
完成测试
1.string(字符串)
[root@squid utils]# redis-cli -h 192.168.100.10 -p 6379
192.168.100.10:6379> set aa 10
OK
192.168.100.10:6379> get aa
"10"
192.168.100.10:6379> type aa
string
192.168.100.10:6379> incr aa
(integer) 11
192.168.100.10:6379> decr aa
(integer) 10
192.168.100.10:6379> decrby aa 2
(integer) 8
192.168.100.10:6379> decrby aa 1
(integer) 7
192.168.100.10:6379> incrby aa 3
(integer) 10
2. hash(哈希)
[root@squid ~]# redis-cli -h 192.168.100.10 -p 6379
192.168.100.10:6379> hset hash1 key1 a
(integer) 1
192.168.100.10:6379> hset hash1 key2 b
(integer) 1
192.168.100.10:6379> hset hash1 key3 c
(integer) 1
192.168.100.10:6379> hset hash1 field1 a1 field2 a2
(integer) 2
192.168.100.10:6379> hmget hash1 key1 key2 key3 field1 field2
1) "a"
2) "b"
3) "c"
4) "a1"
5) "a2"
3.List(列表)
[root@squid ~]# redis-cli -h 192.168.100.10 -p 6379
192.168.100.10:6379> lpush list1 11 22 33 55 66 88
(integer) 6
[root@squid ~]# redis-cli -h 192.168.100.10 -p 6379
192.168.100.10:6379> lpush list1 11 22 33 55 66 88
(integer) 6
192.168.100.10:6379> llen list1
(integer) 6
192.168.100.10:6379> lpop list1
"88"
192.168.100.10:6379> llen list1
(integer) 5
192.168.100.10:6379> lrange list1 0 10
1) "66"
2) "55"
3) "33"
4) "22"
5) "11"
192.168.100.10:6379> rpop list1
"11"
4.Set(集合)
[root@squid ~]# redis-cli -h 192.168.100.10 -p 6379
192.168.100.10:6379> sadd set1 11 22 33 88 66
(integer) 5
192.168.100.10:6379> sadd set1 3
(integer) 1
192.168.100.10:6379> sadd set1 5
(integer) 1
192.168.100.10:6379> sadd set1 8
(integer) 1
192.168.100.10:6379> sadd set1 1
(integer) 1
192.168.100.10:6379> sadd set1 6
(integer) 1
192.168.100.10:6379> sadd set1 9
(integer) 1
192.168.100.10:6379> sismember set1 22
(integer) 1
192.168.100.10:6379> sismember set1 2
(integer) 0
192.168.100.10:6379> srem set1 8
(integer) 1
192.168.100.10:6379> smembers set1
1) "1"
2) "3"
3) "5"
4) "6"
5) "9"
6) "11"
7) "22"
8) "33"
9) "66"
10) "88"
5.zset(sorted set:有序集合)
192.168.100.10:6379> Zadd zset1 1.1 a1
(integer) 1
192.168.100.10:6379> Zadd zset1 1.1 a2
(integer) 1
192.168.100.10:6379> Zadd zset1 2.2 b1
(integer) 1
192.168.100.10:6379> Zadd zset1 2.2 b2
(integer) 1
192.168.100.10:6379> Zadd zset1 3.3 c1
(integer) 1
192.168.100.10:6379> Zrangebyscore zset1 0 10
1) "a1"
2) "a2"
3) "b1"
4) "b2"
5) "c1"
192.168.100.10:6379> Zrange zset1 0 10 withscores
1) "a1"
2) "1.1000000000000001"
3) "a2"
4) "1.1000000000000001"
5) "b1"
6) "2.2000000000000002"
7) "b2"
8) "2.2000000000000002"
9) "c1"
10) "3.2999999999999998"
Redis持久化
1、持久化概述
Redis是运行在内存中,内存中的数据断电丢失
为了能够重用Redis数据,或者防止系统故障,需要将Redis中的数据写入到磁盘空间中,即持久化
2、持久化分类
RDB方式:创建快照的方式获取某一时刻Redis中所有数据的副本
(缺点:只能是一个时刻,不可以连续,存在盲区,可能导致少量数据丢失)
AOF方式:将执行的写命令写到文件的末尾,以日志的方式来记录数据的变化
(缺点:日志文件的量多,人力成本大)
注意:
生产环境RDB+AOF方式,两个快照中间部分采用AOF方式,查找日志中对应时间的写命令
RDB持久化
触发条件
在指定的时间间隔内,执行指定次数的写操作(配置文件控制)
执行save或者是bgsave(异步)命令
执行flushall命令,清空数据库所有数据
执行shutdown命令,保证服务器正常关闭且不丢失任何数据
优缺点
适合大规模的数据恢复
如果业务对数据完整性和一致性要求不高,RDB是很好的选择
数据的完整性和一致性不高
备份时占用内存
通过RDB文件恢复数据
将dump.rdb文件拷贝到redis的安装目录的bin目录下,重启redis服务即可
[root@server1 ~]# cd /var/lib/redis/6379/
[root@server1 6379]# ll
总用量 232
-rw-r–r--. 1 root root 233881 11月 10 14:59 dump.rdb
[root@server1 ~]# vim /etc/redis/6379.conf
save 900 1 #900秒之内至少一次写操作
save 300 10 #300秒内至少10次操作
save 60 10000 #60秒内至少10000次写操作
#只要满足其一都会触发快照操作,注释所有的save项表示关闭RDB
dbfilename dump.rdb #RDB文件名称
dir /var/lib/redis/6379 #RDB文件路径
rdbcompression yes #是否进行压缩
AOF持久化
1、Redis默认不开启
2、弥补RDB的不足(数据的不一致性)
3、采用日志的形式来记录每个写操作,并追加到文件中
4、Redis重启会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
5、根据AOF文件恢复数据
将appendonly.aof文件拷贝到redis安装目录的bin目录下,重启redis服务即可
6、配置文件选项
[root@server1 ~]# vim /etc/redis/6379.conf
appendonly yes #开启AOF持久化
appendfilename “appendonly.aof” #AOF文件名称
#appendfsync always #同步持久化,每次发生数据变化会立刻写入磁盘;
appendfsync everysec #默认推荐,每秒异步记录一次(默认值)
#appendfsync no #不同步,交给操作系统决定如何同步
aof-load-truncated yes #忽略最后一条可能存在问题的指令
AOF的重写机制
AOF的工作原理是将写操作追加到文件中,文件的冗余内容会越来越多
当AOF文件的大小超过所设定的阀值时,Redis就会对AOF文件的内容压缩
AOF的重写的原理
Redis会fork出一条新进程,读取内存中的数据(并没有读取旧文件),并重新写到一个临时文件中,最后替换旧的aof文件
AOF的重写配置
[root@redis 6379]# vim /etc/redis/6379.conf
no-appendfsync-on-rewrite no #在日志进行BGREWRITEAOF时, 如果设置为yes表示新写操作不进行同步fsync,只暂存在缓冲区里,避免造成磁盘I0操作冲突,等重写完成后在写入。redis中默认为no
auto-aof-rewrite-percentage 100 #当前AOF文件大小是上次日志重写时AOF文件大小两倍时,发生BGREWRITEAOF操作
auto-aof-rewrite-min-size 64mb #当前AOF文件执行BGREWRITEAOF命令的最小值,避免刚开始启动Reids时由于文件尺寸较小导致频繁的BGREWRITEAOF.当AOF文件到达64M的时候,发生BGREWRITEAOF操作
查看Redis内存使用
[root@server1 ~]# redis-cli
127.0.0.1:6379> info memory
#Memory
used_memory:11315280 #内存使用总量
used_memory_human:10.79M
…省略内容
mem_fragmentation_ratio:1.76 #内存碎片率
mem_fragmentation_bytes:8566768
内存碎片率介绍
1、操作系统分配的内存值used_memory_rss除以redis使用的内存值
used_ memory计算得出
2、内存碎片是由操作系统低效的分配/回收物理内存导致的
不连续的物理内存分配
3、跟踪内存碎片率对理解redis实例的资源性能是非常重要的
内存碎片率稍大于1是合理的,这个值表示内存碎片率比较低
内存碎片率超过1.5,说明redis消耗了实际需要物理内存的150%,其中50%是 内存碎片率
内存碎片率低于1的,说明Redis内存分配超出了物理内存,操作系统正在进行内存交换
(内存碎片率为1是最佳,低于1访问速度会慢,高于1说明碎片太多)
内存使用率介绍
1、redis实例的内存使用率超过可用最大内存,操作系统将开始进行
内存与swap空间交换(这时redis响应速度会变慢)
2、避免内存交换
针对缓存数据大小选择
尽可能的使用Hash数据结构
设置key的过期时间
如何回收key
1、保证合理分配redis有限的内存资源
2、当达到设置的最大阈值时,需选择一种key的回收策略
默认情况下回收策略是noeviction(禁止收回)
/etc/redis/6379.conf配置文件中修改maxmemory-policy属性值
volatile-lru:使用LRU算法从已设置过期时间的数据集合中淘汰数据
volatile-ttl:从已设置过期时间的数据集合中挑选即将过期的数据淘汰(建议使用)
volatile-random:从已设置过期时间的数据集合中随机挑选数据淘汰
allkeys-lru:使用LRU算法从所有数据集合中淘汰数据
allkeys-random:从数据集合中任意选择数据淘汰
no-enviction:禁止淘汰数据
去掉#注释后,配置文件一定要顶格写