redis持久化存储

redis存储系统
  1. redis概述

REmote DIctionary Server(Redis)是一个基于key-value键值对的持久化数据库存储系统。redis和大名鼎鼎的Memcached缓存服务软件很像,但是redis支持的数据存储类型比memcached更丰富,包括strings(字符串),lists(列表),sets(集合)和sorted sets(有序集合)等。
这些数据类型支持push/pop,add/remove及取交集,并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached缓存服务一样,为了保证效率,数据都是缓存在内存中提供服务。和memcached不同的是,redis持久化缓存服务还会周期性的把更新的数据写入到磁盘以及把修改的操作记录追加到文件里记录下来,比memcached更有优势的是,redis还支持master-slave(主从)同步,这点很类似关系型数据库MySQL主从复制功能。
Redis是一个开源的使用C语言编写(3万多行代码),支持网络,可基于内存亦可持久化的日志型,Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。
Redis软件的出现,再一定程度上弥补了memcached这类key-value内存缓存服务的不足,在部分场合可以对关系数据库起到很好的补充作用。redis提供了Python,Ruby,Erlang,PHP客户端,使用起来很方便。redis官方文档如下:
http://www.redis.io/documentation
http://www.redis.cn/
http://www.redis.io/topics/introduction
在这里插入图片描述
2. redis特点

key-value键值类型存储
支持数据可靠存储及落地
单进程单线程高性能服务器
crash safe & recovery slow
单机qps可以达到10W
适合小数据量高速读写访问
Redis速度极快,但是,他是单进程运作的,因此,同一时间redis其实只能处理一个用户的请求,处理完毕再处理下一个用户。
3. Redis优点

与memcached不同,Redis可以持久化存储数据
性能很高:Redis能支持超过10W每秒的读写频率。
丰富的数据类型:Redis支持二进制的Strings,Lists,Hashes,Sets及sorted Sets等数据类型操作
原子:Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行
丰富的特性:Redis还支持publish/subscribe(发布/订阅),通知,key过期等等特性。
redis支持异机主从复制。

  1. redis缺陷与陷阱

    系统运行有毛刺
    不同命令延迟差别极大
    内存管理开销大(设置低于物理内存3/5)
    buffer io造成系统OOM(内存溢出)

  2. redis的数据类型

    作为Key-value型存储系统数据库,Redis提供了键(Key)和值(value)映射关系。但是,除了常规的数值或字符串,Redis的键值还可以是以下形式之一,下面为最为常用的数据类型:

    String 字符串
    Hash 哈希表
    List 列表
    Set 集合
    Sorted set 有序集合
    在这里插入图片描述

  3. redis 持久化

    通常,Redis将数据存储于内存中,或被配置为使用虚拟内存。通过两种方式可以实现数据持久化:
    (1)使用快照(snapshot)的方式,将内存中的数据不断写入磁盘;
    (2)使用类似MySQL的binlog日志(aof但并不用于主从同步)方式,记录每次更新的日志。
    前者性能较高,但是可能会引起一定程度的数据丢失;后者相反。
    在这里插入图片描述

#名词解释
#Snapshot(快照)
save 900 1      #900秒有1key容量被更新,则触发快照写入磁盘
save 300 10
save 60 10000#AOF(更新日志)
appendfsync always  #总是记录更新内容
appendfsync everysec    #每秒记录更新内容
appendfsync no  #不记录更新内容

在这里插入图片描述

特别提示:
如果选择了快照的策略,那么快照在每次进行保存的时候,都会阻碍执行前端的客户端请求。
快照会一次性将内存里的数据全都写进磁盘。
  1. redis的应用场景

(1)MySQL+Memcached网站架构问题

通过MySQL数据库存储数据库数据,加上通过Memcached把热点数据存放到内存cache里,达到加速数据访问减轻数据库压力的目的,这是绝大部分公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,很多问题就会暴露出来:需要不断的对MySQL进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发运维时间。
Memcached与MySQL数据库数据一致性问题是个老大难。
Memcached数据命中率低或down机,会导致大量访问直接穿透到数据库,导致MySQL无法支撑访问。
跨机房cache同步及cache数据一致性问题

(2)redis的最佳应用场景

Redis最佳试用场景是全部数据in-memory
Redis更多场景是作为Memcached的替代品来使用。
数据比较重要,对数据一致性有一定要求的业务。
当需要除key/value之外的更多数据类型支持时,使用Redis更合适。
需要提供主从同步以及负载均衡分布式应用场景(redis主从同步)

更多

a.Redis作者谈Redis应用场景
http://blog.nosqlfan.com/html/2235.html

b.使用Redis bitmap进行活跃用户统计
http://blog.nosqlfan.com/html/3501.html

    计数,cache服务,展示最近,最热,点击率最高,活跃度最高等等条件的top list,用户最近访问记录,Relation List/Message Queue,粉丝列表。Key-Value Store 更加注重对海量数据存取的性能,分布式,扩展性支持上,并不需要传统关系数据库的一些特征,例如:Schema,事务,完整SQL查询支持等等,因此在分布式环境下的性能相对于传统的关系数据库有较大提升。

在这里插入图片描述在这里插入图片描述

  1. redis的应用案例

sina使用redis案例:

(1)application -->redis

(2)应用程序首先访问Redis,只有当Redis没有数据或访问失败时访问redis。

(3)二次开发实现MySQL和redis互相同步

MySQL -->Redis复制

通过RBR解析BINLOG同步到redis
Redis提供特定数据结构的读访问
实现关系型数据转变成队列数据

Redis -->MySQL复制

Redis提供特定数据结构的读写
通过replication接口同时写入到MySQL

新浪为什么用redis?

数据结构(Data Structure)需求越来越多,但Memcache中没有,影响开发效率。
性能需求,随着读操作的量的上升需要解决,经历的过程有:数据库读写分离(M/S)-->数据库使用多个Slave -->增加Cache(memcache)-->转到Redis
解决写的问题:水平拆分,对表的拆分,将有的用户放在这个表,有的用户放在另外一个表。
可靠性需求:Cache的“雪崩”问题让人纠结;Cache面临着快速恢复的挑战。
开发成本需求:Cache和DB的一致性维护成本越来越高(先清理DB,再清理缓存,不行啊,太慢了!)开发需要跟上不断涌入的产品需求,硬件成本最贵的就是数据库层面的机器,基本上比前端的机器要贵几倍,主要是IO密集型,很耗硬件。
维护性复杂:一致性维护成本越来越高。BerkeleyDB使用B树,会一直写新的,内部不会有文件重新组织;这样会导致文件越来越大;大的时候需要进行文档归档,归档的操作要定期做;这样,就需要有一定的down time。所以基于以上考虑,新浪选择了Redis
  1. Redis的生产经验教训

    一定要进行Master-slave主从同步配置,在出现服务故障时可以切换
    在master禁用数据持久化,只需要在slave上配置数据持久化
    物理内存+虚拟内存不足,这个时候dump一直死着,时间久了机器挂掉。这个情况就是灾难!
    当Redis物理内存使用超过内存总容量的3/5时就会开始比较危险了,就开始做swap,内存碎片大!
    当达到最大内存时,会清空带有过期时间的key,即使key未到过期时间。
    redis与DB同步写的问题,先写DB,后写redis,因为写内存基本上没有问题。

Redis服务器4.0版本源码编译安装

yum仓库使用技巧

#查找一个命令出自哪个rpm包
[root@Redis01 ~]# yum provides "*bin/ifconfig"
net-tools-2.0-0.22.20131004git.el7.x86_64 : Basic networking tools
源    :base
匹配来源:
文件名    :/sbin/ifconfig[root@Redis01 ~]# yum provides "*bin/brctl"
bridge-utils-1.5-9.el7.x86_64 : Utilities for configuring the linux ethernet bridge
源    :base
匹配来源:
文件名    :/usr/sbin/brctl[root@Redis01 ~]# yum provides "*bin/nslookup"
32:bind-utils-9.9.4-61.el7.x86_64 : Utilities for querying DNS name servers
源    :base
匹配来源:
文件名    :/usr/bin/nslookup
  1. 部署redis环境
主机名ens33用途
redis01192.168.146.164主Redis
  1. 开始安装redis服务

    在redis的官方网站(http://www.redis.io)下载最新的稳定版本redis。

[root@localhost ~]# ls
anaconda-ks.cfg  redis-4.0.11.tar.gz
[root@localhost ~]# yum -y install wget gcc gcc-c++ make tar openssl openssl-devel cmake
[root@localhost ~]# tar xf redis-4.0.11.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/redis-4.0.11/
[root@localhost redis-4.0.11]# make 
[root@localhost redis-4.0.11]# make MALLOC=jemalloc
[root@localhost redis-4.0.11]# make PREFIX=/usr/local/redis install
[root@localhost redis-4.0.11]# cd /usr/local/redis/
[root@localhost redis]# ls
bin
[root@localhost redis]# mkdir -p /usr/local/redis/conf
[root@localhost redis]# cp /usr/src/redis-4.0.11/redis.conf /usr/local/redis/conf/
[root@localhost redis]# cp /usr/src/redis-4.0.11/sentinel.conf /usr/local/redis/conf/
[root@localhost redis]# ln -s /usr/local/redis/bin/* /usr/local/bin/
[root@localhost redis]# which redis-server
/usr/local/bin/redis-server
[root@localhost redis]# redis-server --version			#服务端连接命令
Redis server v=4.0.11 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=86ef428c1d080d76
[root@localhost redis]# redis-cli --version					#客户端连接命令
redis-cli 4.0.11	
Redis服务器启动和系统参数调整
  1. 简化redis配置文件
[root@localhost ~]# cd /usr/local/redis/
[root@localhost redis]# cp conf/redis.conf{,.bak}
[root@localhost redis]# egrep -v "^$|^#" conf/redis.conf.bak > conf/redis.conf
[root@localhost redis]# mkdir -p /data/redis/				#创建redis数据目录
  1. 更改redis配置文件/usr/local/redis/conf/redis.conf
#修改redis配置文件以下参数
[root@localhost redis]# vim conf/redis.conf1 bind 0.0.0.0						#监听地址2 protected-mode yes3 port 6379							#监听端口4 tcp-backlog 1024				#tcp连接数5 timeout 06 tcp-keepalive 3007 daemonize yes					#是否后台启动8 supervised no9 pidfile /data/redis/redis.pid				 #pid存放目录10 loglevel notice	11 logfile "/data/redis/redis.log"				#日志存放目录12 databases 1613 always-show-logo yes14 save 900 115 save 300 1016 save 60 1000017 stop-writes-on-bgsave-error yes18 rdbcompression yes19 rdbchecksum yes20 dbfilename dump.rdb21 dir /data/redis						#工作目录22 slave-serve-stale-data yes23 slave-read-only yes24 repl-diskless-sync no25 repl-diskless-sync-delay 526 repl-disable-tcp-nodelay no27 slave-priority 10028 lazyfree-lazy-eviction no29 lazyfree-lazy-expire no30 lazyfree-lazy-server-del no
  1. redis服务器启动和关闭
#启动redis服务器
[root@localhost redis]# redis-server /usr/local/redis/conf/redis.conf
[root@localhost redis]# netstat -antup | grep redis
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      14640/redis-server  #关闭本地redis服务器
[root@localhost redis]# redis-cli -p 6379 -h 127.0.0.1 shutdown 	 # 可以不写-p,-h,默认 -p 6379 -h 127.0.0.1
[root@localhost redis]# netstat -antup | grep redis#连接redis服务器(交互式连接redis)
[root@localhost redis]# redis-server /usr/local/redis/conf/redis.conf
[root@localhost redis]# redis-cli -h 127.0.0.1
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> exit
  1. 系统参数优化调整
#启动redis以后,查看系统日志
[root@localhost redis]# cat /data/redis/redis.log
14639:C 04 Jan 02:55:40.866 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
14639:C 04 Jan 02:55:40.866 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=14639, just started
14639:C 04 Jan 02:55:40.866 # Configuration loaded
14640:M 04 Jan 02:55:40.870 * Increased maximum number of open files to 10032 (it was originally set to 1024).#警告提示1:系统文件描述符设置的太小了,才1024(单进程),我们最好设置到10032_._                                                  _.-``__ ''-._                                             _.-``    `.  `_.  ''-._           Redis 4.0.11 (00000000/0) 64 bit.-`` .-```.  ```\/    _.,_ ''-._                                   (    '      ,       .-`  | `,    )     Running in standalone mode|`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379|    `-._   `._    /     _.-'    |     PID: 14640`-._    `-._  `-./  _.-'    _.-'                                   |`-._`-._    `-.__.-'    _.-'_.-'|                                  |    `-._`-._        _.-'_.-'    |           http://redis.io        `-._    `-._`-.__.-'_.-'    _.-'                                   |`-._`-._    `-.__.-'    _.-'_.-'|                                  |    `-._`-._        _.-'_.-'    |                                  `-._    `-._`-.__.-'_.-'    _.-'                                   `-._    `-.__.-'    _.-'                                       `-._        _.-'                                           `-.__.-'                                               14640:M 04 Jan 02:55:40.875 # WARNING: The TCP backlog setting of 1024 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
#警告提示2:对一个高负载的环境来说tcp设置128这个值,太小了。
14640:M 04 Jan 02:55:40.875 # Server initialized
14640:M 04 Jan 02:55:40.875 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
#警告提示3:overcommit_memory=0为不允许超额抢占内存,但是,rdb保存可能会失败。建议将vm.overcommit_memory = 1进行修改
14640:M 04 Jan 02:55:40.875 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
#警告提示4:你的内核中启用了巨大内存页的支持,这将与redis的延迟内存使用冲突。
14640:M 04 Jan 02:55:40.876 * Ready to accept connections

(1)调整系统文件描述符

[root@localhost redis]# echo "* - nofile 10240" >> /etc/security/limits.conf
[root@localhost redis]# tail -1 /etc/security/limits.conf
* - nofile 10240							# *代表任意用户,-代表文件,nofile文件打开数#只要退出登陆一下即可生效
[root@localhost ~]# exit
[root@localhost ~]# ulimit -n		#文件打开数						
10240

(2)调整系统tcp连接数

[root@localhost ~]# sysctl -a | grep soma
net.core.somaxconn = 128
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.ens33.stable_secret"
sysctl: reading key "net


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部