01_Redis安装及基本优化

Redis简介

1.1 初识Redis

Redis(Remote dictionary server)是一个开源(BSD许可),是一种基于键值对(key-value)的NoSQL数据库,是内存存储的数据结构服务器,可用作高速缓存和消息队列代理。

与很多键值对数据库不同的是,redis支持字符串(string)、哈希表(hash)、列表(list)、集合(set)、有序集合(zset),位图(bitmaps),HyperLogLogs、GEO等数据结构和算法组成,因此redis可以满足很多的应用场景,而且以内redis会将所有的数据都存放在内存中,所以读写性能非常惊人。不仅如此,Redis还可以将内存的数据利用快照和日志的形式保存到硬盘上,这样在发生类似断电或者机器故障的时候,内存中的数据不会“丢失”。除了上述功能以外,Redis还提供键过期、流水线、哨兵、内置复制、Lua脚本、LRU收回、事务,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。

2008年, Redis的作者Salvatore Sanfilippo在开发一个叫LLOOGG的网站时,需要实现一个高性能的队列功能,最开始是使用MySQL来实现的,但后来发现无论怎么优化SQL语句都不能使网站的性能提高上去,再加上自己囊中羞涩,于是他决定自己做一个专属于LLOOGG的数据库,这个就是Redis的前身。后来,Salvatore Sanfilippo将Redis 1.0的源码!开放到GitHub上,可能连他自己都没想到, Redis后来如此受欢迎。 假如现在有人问Redis的作者都有谁在使用Redis,从Redis的官方公司统计来看,有很多重量级的公司都在使用Redis,如国外的Twitter, Instagram, Stack Overflow, GitHub等,国内就更多了,如果单单从体量来统计,新浪微博可以说是全球最大的Redis使用者,除了新浪微博。还有像阿里巴巴、腾讯、百度、搜狐、优酷土豆、美团、小米、唯品会等公司都是Redis的使用者。

1.2 Redis特性

Redis之所以受到如此多公司的青睐,必然有过人之处,那我们来说一说Redis的8个特性。

1、速度快
正常情况下, Redis执行命令的速度非常快,官方给出的数字是读写性能可以达到10万/秒.当然这也取决于机器的性能,但这里先不讨论机器性能上的差异,只分析一下是什么造就了Redis如此之快的速度,可以大致归纳为以下三
点:

  • 把数据放在内存中是Redis速度快的最主要原因。
  • Redis是用C语言实现的,一般来说C语言实现的程序“距离”操作系统更近,执行速度相对会更快。
  • Redis使用了单线程架构,预防了多线程可能产生的竞争问题。

2、基于键值对的数据结构服务器
几乎所有的编程语言都提供了类似字典的功能,例如Java里的map, Python里的dict, 类似于这种组织数据的方式叫作基于键值的方式,与很多键值对数据库不同的是, Redis中的值不仅可以是字符串,而且还可以是具体的数据结构,这样不仅能便于在许多应用场景的开发,同时也能够提高开发效率。Redis的全称是REmote Dictionary Server,它主要提供了5种数据结构:字符串、哈希、列表、集合、有序集合,同时在字符串的基础之上演变出了位图(Bitmaps)和HyperLogLog两种神奇的“数据结构”,并且随着LBS ( Location Based Service,基于位置服务)的不断发展, Redis 3.2版本中加人有关GEO (地理信息定位)的,功能,总之在这些数据结构的帮助下,开发者可以开发出各种“有意思”的应用。

3、丰富的功能
除了5种数据结构, Redis还提供了许多额外的功能:

  • 提供了键过期功能,可以用来实现缓存。
  • 提供了发布订阅功能,可以用来实现消息系统。
  • 支持Lua脚本功能,可以利用Lua创造出新的Redis命令。
  • 提供了简单的事务功能,能在一定程度上保证事务特性。
  • 提供了流水线(Pipeline)功能,这样客户端能将一批命令一次性传到Redis,减少了网络的开销。

5、客户端语言多
Redis提供了简单的TCP通信协议,很多编程语言可以很方便地接入到Redis,并且由于Redis受到社区和各大公司的广泛认可,所以支持Redis的客户端语言也非常多,几乎涵盖了主流的编程语言,例如Java、PHP、Python、C、C++、 Nodejs等

6、持久化
通常看,将数据放在内存中是不安全的,一旦发生断电或者机器故障,重要的数据可能就会丢失,因此Redis提供了两种持久化方式:RDB和AOF,即可以用两种策略将内存的数据保存到硬盘中,这样就保证了数据的可持久性。

7、主从复制
Redis提供了复制功能,实现了多个相同数据的Redis副本,复制功能是分布式Redis的基础。

8、高可用和分布式
Redis从2.8版本正式提供了高可用实现Redis Sentinel,它能够保证Redis节点的故障发现和故障自动转移。Redis从3.0版本正式提了分布式实现Redis Cluster,它是Redis真正的分布式实现,提供了高可用、读写和容量的扩展性。

1.3 Redis使用场景

我们已经了解了Redis的很多特性,那么我们来看一下Redis的典型应用场景有哪些?

1.3.1 Redis可以做什么?
1、缓存
缓存机制几乎在所有的大型网站都有使用,合理地使用缓存不仅可以加快数据的访问速度,而且能够有效地降低后端数据源的压力。Redis提供了键值过期时间设置,并且也提供了灵活控制最大内存和内存溢出后的淘汰策略。可以这么说,一个合理的缓存设计能够为一个网站的稳定保驾护航。

2、排行榜系统 排行榜系统几乎存在于所有的网站,例如按照热度排名的排行榜,按照发布时间的排行榜,按
照各种复杂维度计算出的排行榜,Redis提供了列表和有序集合数据结构,合理地使用这些数据结构可以很方便
地构建各种排行榜系统。

3、计数器的应用
计数器在网站中的作用至关重要,例如视频网站有播放数、电商网站有浏览数,为了保 证数据的实时性,每一次播放和浏览都要做加1的操作,如果并发量很大对于传统关系型数据的性能是一种挑战。Redis天然支持计数功能而且计数的性能也非常好,可以说是计数器系统的重要选择。

4、社交网络
赞/踩、粉丝、共同好友/喜好、推送、下拉刷新等是社交网站的必备功能,由于社交网站访问量通常比较大,而且传统的关系型数据不太适合保存这种类型的数据, Redis提供的数据结构可以相对比较容易地实现这些功能。

5、消息列队系统
消息队列系统可以说是一个大型网站的必备基础组件,因为其具有业务解耦、非实时业务肖峰等特性。Redis提供了发布订阅功能和阻塞队列的功能,虽然和专业的消息队列比还不够强大,但是对于一般的消息队列功能基本可以满足。

1.3.2 Redis不可以做什么

实际上和任何一门技术一样,每个技术都有自己的应用场景和边界,也就是说Redis并不是万能的,有很多适合它解决的问题,但是也有很多不合适它解决的问题。

我们可以站在数据规模和数据冷热的角度来进行分析。 站在数据规模的角度看,数据可以分为大规模数据和小规模数据,我们知道Redis的数 据是存放在内存中的,虽然现在内存已经足够便宜,但是如果数据量非常大,例如每天有几亿的用户行为数据,使用Redis来存储的话,基本上是个无底洞,经济成本相当的高。 站在数据冷热的角度看,数据分为热数据和冷数据,热数据通常是指需要频繁操作的数据,反之为冷数据。例如对于视频网站来说,视频基本信息基本上在各个业务线都是经常要操作的数据,而用户的观看记录不一定是经常需要访问的数据,这里暂且不讨论两者数据规模的差异,单纯站在数据冷热的角度上看,视频信息属于热数据,用户观看记录属于冷数据。如果将这些冷数据放在Redis中,基本上是对于内存的一种浪费,但是对于一些热数据,可以放在Redis中加速读写,也可以减轻后端存储的负载,可以说是事半功倍。 所以, Redis并不是万能的,相信随着我们对Redis的逐步学习,能够清楚Redis真正的使用场景。

1.4 安装部署Redis

wget http://download.redis.io/releases/redis-5.0.9.tar.gz
[root@redis-01 ~]# tar zxf redis-5.0.9.tar.gz -C /usr/local/src/
[root@redis-01 ~]# cd /usr/local/src/redis-5.0.9/
[root@redis-01 redis-5.0.9]# make 

//cp配置文件和命令到自定义目录中

[root@redis-01 ~]# mkdir /usr/local/redis/{conf,bin} -p
[root@redis-01 ~]# cp /usr/local/src/redis-5.0.9/src/redis* /usr/local/redis/bin/
[root@redis-01 ~]# cp /usr/local/src/redis-5.0.9/redis.conf /usr/local/redis/conf/

//删除多余命令

[root@redis-01 ~]# cd /usr/local/redis/bin/
[root@redis-01 bin]# ls
redisassert.h      redis-check-aof    redis-check-rdb.c  redis-cli.o     redis-trib.rb
redis-benchmark    redis-check-aof.c  redis-check-rdb.o  redismodule.h
redis-benchmark.c  redis-check-aof.o  redis-cli          redis-sentinel
redis-benchmark.o  redis-check-rdb    redis-cli.c        redis-server
[root@redis-01 bin]# rm -rf *.o
[root@redis-01 bin]# rm -rf *.c
[root@redis-01 bin]# ls
redisassert.h    redis-check-aof  redis-cli      redis-sentinel  redis-trib.rb
redis-benchmark  redis-check-rdb  redismodule.h  redis-server

命令在:/usr/local/redis/bin/
配置文件在:/usr/local/redis/conf/

更改配置文件

[root@redis-01 bin]# mkdir /data/redis -p
[root@redis-01 bin]# vim /usr/local/redis/conf/redis.conf 
.....
bind 127.0.0.1 192.168.1.40 
daemonize yes
pidfile /data/redis/redis.pid 
logfile "/data/redis/redis.log" 
dir /data/redis

pid放在:/data/redis/redis.pid
日志放在:"/data/redis/redis.log" dir /data/redis

配置文件重要选项解释如下

Prot :端口
Logfile :日志文件
Loglevel verbose : 日志级别:debug \verbose\notice\warning日志输出方式logfilestdout
Rdbcomperssion yes :指定存储到本地数据库是否进行数据压缩节省cpu可关闭但数据库文件巨大Dbfilename
dump.rdb :指定本地数据库的文件名 默认dump.rdb
Slaveof :本机为主从的从,设置主服务器ip和端口,对主进行数据同步 Masterauth 当主设置密码保护,从服务器可以连接master的密码 Requirepass
foobared :并发连接数,同一个时间最大客户端的连接数,0表示没有限制
Maxmemory :指定每次更新操作都会进行日志记录,默认为NO
Appendfilename appendonly.aof :指定更新日志的文件名 Everysec 每秒同步一次(默认值,速度折中) No:系统进行数据缓存同步到磁盘(no的方式快) Always 每次更新操作后,手动调用fsync将数据写到磁盘(很慢,但很安全)
Vm-enabled no :是否启用虚拟内存机制(默认为no)
Vmswap-file /路径/redis.swap : 虚拟内存文件路径
Vm-max-memeory 0 : 大于后面跟的这个数放入虚拟内存当中
Glueoutputbuf yes :(开启流水线)设置向客户端应答的时候是否把较小的包合并一个包发送 Dir 工作目录Bind –绑定的主机地址 protected-mode yes 默认开启保护模块 timeout 0 多少秒断开 0默认关闭 tcp-keepalive300 tcp连接超时时间300秒 daemonize no 是否以守护进程的方式启动redis 默认NO databases 16 数据库编号最多0-16个 可以自己定 always-show-logo yes 默认开启显示logo save 900 1 900秒有1个更改保存 save 300 10300秒有10个更改保存 save 60 10000 60秒有1W个更改保存

redis –h host –p port通过交互式方式连接redis

[root@redis-01 bin]# ln -s /usr/local/redis/bin/* /usr/sbin/
[root@redis-01 bin]# redis-server /usr/local/redis/conf/redis.conf 
[root@redis-01 bin]# netstat -anput | grep redis
tcp        0      0 192.168.1.71:6379       0.0.0.0:*               LISTEN      6265/redis-server 1 
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      6265/redis-server 1 
[root@redis-01 ~]# redis-cli -h 192.168.1.71 -p 6379
192.168.1.71:6379> SHUTDOWN

此时查看日志,发现有些问题,所以要进行优化
//查看/data/redis/redis.log中需要优化如下一共四条需要优化

【第一条】6265:M 18 Mar 2021 15:08:41.324 * Increased maximum number of open files to 10032 (it was originally set to 1024).
【第二条】6265:M 18 Mar 2021 15:08:41.326 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
【第三条】6265:M 18 Mar 2021 15:08:41.326 # 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.
【第四条】6265:M 18 Mar 2021 15:08:41.326 # 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.                                           

优化第一条

[root@redis-01 ~]# ulimit -n
1024
[root@redis-01 ~]# vim /etc/security/limits.conf 
....
* 		-		 nofile	 	10032

//切换另一个终端

[root@redis-01 ~]# ulimit -n
10032

优化第二条

[root@redis-01 ~]# echo "511" > /proc/sys/net/core/somaxconn
[root@redis-01 ~]# vim /etc/sysctl.conf 
....
net.core.somaxconn = 511
[root@redis-01 ~]# sysctl -p
net.core.somaxconn = 511

优化第三条

[root@redis-01 ~]# vim /etc/sysctl.conf 
[root@redis-01 ~]# systemctl -p
.....
vm.overcommit_memory = 1
[root@redis-01 ~]# sysctl -p
vm.overcommit_memory = 1
net.core.somaxconn = 511

优化第四条

[root@redis-01 ~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@redis-01 ~]# vim /etc/rc.local 
......
echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@redis-01 ~]# chmod +x /etc/rc.local 

重新启动redis

[root@redis-01 ~]#  > /data/redis/redis.log  #清空日志文件方便查看
[root@redis-01 ~]# kill -9 `cat /data/redis/redis.pid `
[root@redis-01 ~]# redis-server  /usr/local/redis/conf/redis.conf 

查看日志会发现没有了警告信息了

[root@redis-01 ~]# cat  /data/redis/redis.log 
.....此处省略日志信息

猜你喜欢

转载自blog.csdn.net/weixin_45310323/article/details/114976888