Redis官网:http://www.redis.cn/
Redis全称是:REmote DIctionary Server(远程字典服务器),redis是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务器!
速度快
正常情况下, Redis执行命令的速度非常快,官方给出的数字是读写性能可以达到10万/秒.当然这也取决于机器的性能,但这里先不讨论机器性能上的差异,只分析一下是什么造就了Redis如此之快的速度,可以大致归纳为以下三点::
基于键值对的数据结构服务器
几乎所有的编程语言都提供了类似字典的功能,例如Java里的map, Python里的dict, 类似于这种组织数据的方式叫作基于键值的方式,与很多键值对数据库不同的是, Redis中的值不仅可以是字符串,而且还可以是具体的数据结构,这样不仅能便于在许多应用场景的开发,同时也能够提高开发效率。Redis的全称是REmote Dictionary Server,它主要提供了5种数据结构:字符串、哈希、列表、集合、有序集合,同时在字符串的基础之上演变出了位图(Bitmaps)和HyperLogLog两种神奇的“数据结构”,并且随着LBS ( Location Based Service,基于位置服务)的不断发展, Redis 3.2版本中加人有关GEO (地理信息定位)的,功能,总之在这些数据结构的帮助下,开发者可以开发出各种“有意思”的应用。
丰富的功能
除了5种数据结构, Redis还提供了许多额外的功能::
简单稳定
Redis的简单主要表现在三个方面。首先, Redis的源码很少,早期版本的代码只有2万 行左右, 3.0版本以后由于添加了集群特性,代码增至5万行左右,相对于很多NoSQL数据库来说代码量相对要少很多,也就意味着我们完全可以“吃透”它。其次, Redis使用单线程模型,这样不仅使得Redis服务端处理模型变得简单,而且也使得客户端开发变得简单。最后, Redis不需要依赖于操作系统中的类库(例如Memcache需要依赖libevent这样的系统类库), Redis自己实现了事件处理的相关功能。 Redis虽然很简单,但是不代表它不稳定。
客户端语言多
Redis提供了简单的TCP通信协议,很多编程语言可以很方便地接入到Redis,并且由于Redis受到社区和各大公司的广泛认可,所以支持Redis的客户端语言也非常多,几乎涵盖了主流的编程语言,例如Java、PHP、Python、C、C++、 Nodejs等
持久化
通常看,将数据放在内存中是不安全的,一旦发生断电或者机器故障,重要的数据可能就会丢失,因此Redis提供了两种持久化方式:RDB和AOF,即可以用两种策略将内存的数据保存到硬盘中,这样就保证了数据的可持久性。
主从复制
Redis提供了复制功能,实现了多个相同数据的Redis副本,复制功能是分布式Redis的基础。
高可用和分布式
Redis从2.8版本正式提供了高可用实现Redis Sentinel,它能够保证Redis节点的故障发现和故障自动转移。Redis从3.0版本正式提了分布式实现Redis Cluster,它是Redis真正的分布式实现,提供了高可用、读写和容量的扩展性。
缓存
缓存机制几乎在所有的大型网站都有使用,合理地使用缓存不仅可以加快数据的访问速 度,而且能够有效地降低后端数据源的压力。Redis提供了键值过期时间设置,并且也提供了灵活控制最大内存和内存溢出后的淘汰策略。可以这么说,一个合理的缓存设计能够为一个网站的稳定保驾护航。
排行榜系统
排行榜系统几乎存在于所有的网站,例如按照热度排名的排行榜,按照发布时间的排行榜,按照各种复杂维度计算出的排行榜,Redis提供了列表和有序集合数据结构,合理地使用这些数据结构可以很方便地构建各种排行榜系统。
计数器的应用
计数器在网站中的作用至关重要,例如视频网站有播放数、电商网站有浏览数,为了保 证数据的实时性,每一次播放和浏览都要做加1的操作,如果并发量很大对于传统关系型数据的性能是一种挑战。Redis天然支持计数功能而且计数的性能也非常好,可以说是计数器系统的重要选择。
社交网络
赞/踩、粉丝、共同好友/喜好、推送、下拉刷新等是社交网站的必备功能,由于社交网站访问量通常比较大,而且传统的关系型数据不太适合保存这种类型的数据, Redis提供的数据结构可以相对比较容易地实现这些功能。
消息列队系统
消息队列系统可以说是一个大型网站的必备基础组件,因为其具有业务解耦、非实时业务肖峰等特性。Redis提供了发布订阅功能和阻塞队列的功能,虽然和专业的消息队列比还不够强大,但是对于一般的消息队列功能基本可以满足。
实际上和任何一门技术一样,每个技术都有自己的应用场景和边界,也就是说Redis并不是万能的,有很多适合它解决的问题,但是也有很多不合适它解决的问题。我们可以站在数据规模和数据冷热的角度来进行分析。 站在数据规模的角度看,数据可以分为大规模数据和小规模数据,我们知道Redis的数据是存放在内存中的,虽然现在内存已经足够便宜,但是如果数据量非常大,例如每天有几亿的用户行为数据,使用Redis来存储的话,基本上是个无底洞,经济成本相当的高。 站在数据冷热的角度看,数据分为热数据和冷数据,热数据通常是指需要频繁操作的数据,反之为冷数据。例如对于视频网站来说,视频基本信息基本上在各个业务线都是经常要操作的数据,而用户的观看记录不一定是经常需要访问的数据,这里暂且不讨论两者数据规模的差异,单纯站在数据冷热的角度上看,视频信息属于热数据,用户观看记录属于冷数据。如果将这些冷数据放在Redis中,基本上是对于内存的一种浪费,但是对于一些热数据,可以放在Redis中加速读写,也可以减轻后端存储的负载,可以说是事半功倍。 所以, Redis并不是万能的。
Redis下载地址:http://download.redis.io/releases/
[root@redis ~]# wget http://download.redis.io/releases/redis-5.0.9.tar.gz
[root@redis ~]# tar -zxvf redis-5.0.9.tar.gz -C /usr/local/
[root@redis ~]# cd /usr/local/redis-5.0.9/
[root@redis ~]# mv /usr/local/redis-5.0.9/ /usr/local/redis
[root@redis redis]# make && make install
[root@redis redis]# redis-server -v
Redis server v=5.0.9 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=a4d663877e74371d
在/usr/local/redis/src下
可执行的文件 | 解释 |
---|---|
Redis-server | 启动Redis |
Redis-cli | Redis命令行客户端 |
Redis-sentinel | 启动Redis Sentinel |
Redis-check-aof | Redis AOF持久化文件的检查修复 |
Redis-check-RDB | Redis RDB持久化文件的检查修复 |
Redis-benchmark | Redis的基准测试工具 |
[root@redis ~]# mkdir -p /usr/local/redis/data/redis/ #创建存放日志和pid文件的目录
[root@redis ~]# vim /usr/local/redis/redis.conf
[root@redis ~]# cat /usr/local/redis/redis.conf | grep -v ^# | grep -v ^$
......
bind 127.0.0.1 192.168.1.20 #更改位监听所有地址
daemonize yes #启用守护进程
pidfile /usr/local/redis/data/redis/redis.pid #指定pid文件
logfile "/usr/local/redis/data/redis/redis.pid" #定义日志存放路径
dir /usr/local/redis/data/redis/
......#其他配置根据自己所需来更改
[root@redis ~]# redis-server /usr/local/redis/redis.conf #启动
[root@redis ~]# ss -anpt | grep redis #查看Redis进程
LISTEN 0 128 192.168.1.20:6379 *:* users:(("redis-server",pid=21312,fd=7))
LISTEN 0 128 127.0.0.1:6379 *:* users:(("redis-server",pid=21312,fd=6))
其他配置解释
PS:登录Redis,并执行一些简单的操作!!!
[root@redis ~]# redis-cli -h 192.168.1.20 -p 6379
192.168.1.20:6379> set boot very
OK
192.168.1.20:6379> get boot
"very"
192.168.1.20:6379> set hello world
OK
192.168.1.20:6379> get hello
"world"
#关闭redios并保存持久化文件!!
[root@redis ~]# redis-cli shutdown (save/nosave)
#重新登录,查看之前保存的数据!!
[root@redis ~]# redis-server /usr/local/redis/redis.conf
[root@redis ~]# redis-cli -h 192.168.1.20 -p 6379
192.168.1.20:6379> keys * #查看设置的所有键
1) "boot"
2) "hello"
PS:此处调优主要针对于Redis开启之后,日志文件中的 WARNING(警告),但是不要紧张,这只是警告而已不会影响暂时的正常操作!!!
日志文件:
[root@redis ~]# cat /usr/local/redis/data/redis/redis.log
21434:C 18 Mar 2021 18:15:45.981 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
21434:C 18 Mar 2021 18:15:45.981 # Redis version=5.0.9, bits=64, commit=00000000, modified=0, pid=21434, just started
21434:C 18 Mar 2021 18:15:45.981 # Configuration loaded
21435:M 18 Mar 2021 18:15:45.983 * Increased maximum number of open files to 10032 (it was originally set to 1024).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 5.0.9 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 21435
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
21435:M 18 Mar 2021 18:15:45.984 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
21435:M 18 Mar 2021 18:15:45.984 # Server initialized
21435:M 18 Mar 2021 18:15:45.984 # 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.
21435:M 18 Mar 2021 18:15:45.984 # 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.
21435:M 18 Mar 2021 18:15:45.984 * DB loaded from disk: 0.000 seconds
21435:M 18 Mar 2021 18:15:45.984 * Ready to accept connections
# 21435:M 18 Mar 2021 18:15:45.983 * Increased maximum number of open files to 10032 (it was originally set to 1024).
#解决:
[root@redis ~]# vim /etc/security/limits.conf
[root@redis ~]# cat /etc/security/limits.conf | grep -v ^# | grep -v ^$
#打开文件最下方添加
* - nofile 10032
# 21435:M 18 Mar 2021 18:15:45.984 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
#解决:
[root@redis ~]# echo '511' > /proc/sys/net/core/somaxconn
[root@redis ~]# cat /proc/sys/net/core/somaxconn
511
[root@redis ~]# sysctl -a | grep somaxconn
net.core.somaxconn = 511
[root@redis ~]# vim /etc/sysctl.conf
[root@redis ~]# sysctl -p
net.core.somaxconn = 511
# 21435:M 18 Mar 2021 18:15:45.984 # 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.
#解决:
[root@redis ~]# vim /etc/sysctl.conf
[root@redis ~]# sysctl -p
net.core.somaxconn = 511
vm.overcommit_memory = 1
#21435:M 18 Mar 2021 18:15:45.984 # 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 ~]# vim /etc/rc.local
[root@redis ~]# cat /etc/rc.local | grep -v ^# | grep -v ^$
touch /var/lock/subsys/local
echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@redis ~]# chmod +x /etc/rc.local
PS:此处必须重启服务器,否则3.1和3.4的警告还依旧存在!!
[root@redis ~]# ss -anpt | grep redis
LISTEN 0 511 192.168.1.20:6379 *:* users:(("redis-server",pid=7393,fd=7))
LISTEN 0 511 127.0.0.1:6379 *:* users:(("redis-server",pid=7393,fd=6))
[root@redis ~]# kill -9 7393
[root@redis ~]# > /usr/local/redis/data/redis/redis.log #清除之前启动服务留下的日志
[root@redis ~]# redis-server /usr/local/redis/redis.conf
[root@redis ~]# cat /usr/local/redis/data/redis/redis.log
7455:C 18 Mar 2021 18:27:05.968 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
7455:C 18 Mar 2021 18:27:05.968 # Redis version=5.0.9, bits=64, commit=00000000, modified=0, pid=7455, just started
7455:C 18 Mar 2021 18:27:05.968 # Configuration loaded
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 5.0.9 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 7456
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
7456:M 18 Mar 2021 18:27:05.970 # Server initialized
7456:M 18 Mar 2021 18:27:05.970 * DB loaded from disk: 0.000 seconds
7456:M 18 Mar 2021 18:27:05.970 * Ready to accept connections
PS:使用systemctl启动redis!!!
[root@redis ~]# vim /lib/systemd/system/redis.service
[Unit]
Description=The redis-server Process Manager
Documentation=https://redis.io/
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/redis/src/redis-server /usr/local/redis/redis.conf
ExecStop=/usr/local/redis/src/redis-cli shutdown
#有密码则需要在cli后面加 -a "密码"
[Install]
WantedBy=multi-user.target
[root@redis ~]# systemctl start redis.service
[root@redis ~]# systemctl enable redis.service
Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /usr/lib/systemd/system/redis.service.
[root@redis ~]# systemctl status redis.service
● redis.service - The redis-server Process Manager
Loaded: loaded (/usr/lib/systemd/system/redis.service; enabled; vendor preset: disabled)
Active: active (running) since 四 2021-03-18 19:18:40 CST; 9s ago
Docs: https://redis.io/
Main PID: 7609 (redis-server)
CGroup: /system.slice/redis.service
└─7609 /usr/local/redis/src/redis-server 127.0.0.1:6379
3月 18 19:18:40 redis systemd[1]: Starting The redis-server Process Manager...
3月 18 19:18:40 redis systemd[1]: Started The redis-server Process Manager.
1、redis采用单进程:
2、默认16个数据库,类似数组下表从零开始,初始默认使用零号库;
3、统一密码管理,16个库都是同样密码,要么都OK要么一个也连接不上;
4、Redis索引都是从零开始。
注意:生产中禁止使用的命令
#flushdb:清空当前库
#flushdb:清空当前库