redis
1、redis对比memcached:
支持数据持久化,可以将内存中的数据保存在磁盘中,重启redis服务或者服务器之后可以从备份文件中恢复数据到内存继续使用。
支持更多的数据类型:支持string(字符串)、hash(哈希数据)、list(列表)、set(集合)、zet(有序集合)
支持数据备份:可以实现类似于数据的master-slave模式的数据备份,另外也支持使用快照+AOF。
支持更大的value数据:memcached单个key,value最大只支持1M,而redis最大支持512M。
Redis是单线程,而memcached是多线程,所以单机情况下没有memcached并发高,但redis支持分布式集群以实现更高的并发,单redis实例可以实现数万并发。
支持集群横向扩展:基于redis cluster的横向扩展,可以实现分布式集群,大幅提升性能和数据安全。
都是基于C语言开发。
2、redis使用场景
session共享:常见web集群中的tomcat或者PHP中多tomcat服务器session共享
消息队列:ELK的日志缓存、部分业务订阅发布系统
计数器:访问排行榜、商品浏览数等和次数相关的数值统计场景
缓存:数据查询缓存、电商网站商品信息、新闻内容
微博/微信社交场合:共同好友、点赞评论等
3、redis安装
redis官网:https://redis.io
3.1、根据需求下载redis对应版本
下载地址:https://download.redis.io/releases/?_ga=2.185991273.1782951645.1617865616-1544382325.1617865616
下载之后上传至服务器,然后解压到/usr/local/src目录下
[root@redis-server ~]# tar -xf redis-4.0.14.tar.gz -C /usr/local/src
[root@redis-server ~]# cd !$
[root@redis-server src]# ll
总用量 4
drwxrwxr-x. 6 root root 4096 3月 19 2019 redis-4.0.14
[root@redis-server redis-4.0.14]# ll
总用量 304
-rw-rw-r--. 1 root root 166629 3月 19 2019 00-RELEASENOTES
-rw-rw-r--. 1 root root 53 3月 19 2019 BUGS
-rw-rw-r--. 1 root root 1815 3月 19 2019 CONTRIBUTING
-rw-rw-r--. 1 root root 1487 3月 19 2019 COPYING
drwxrwxr-x. 6 root root 124 3月 19 2019 deps
-rw-rw-r--. 1 root root 11 3月 19 2019 INSTALL
-rw-rw-r--. 1 root root 151 3月 19 2019 Makefile
-rw-rw-r--. 1 root root 4223 3月 19 2019 MANIFESTO
-rw-rw-r--. 1 root root 20543 3月 19 2019 README.md
-rw-rw-r--. 1 root root 58766 3月 19 2019 redis.conf
-rwxrwxr-x. 1 root root 271 3月 19 2019 runtest
-rwxrwxr-x. 1 root root 280 3月 19 2019 runtest-cluster
-rwxrwxr-x. 1 root root 281 3月 19 2019 runtest-sentinel
-rw-rw-r--. 1 root root 7921 3月 19 2019 sentinel.conf
drwxrwxr-x. 3 root root 4096 3月 19 2019 src
drwxrwxr-x. 10 root root 167 3月 19 2019 tests
drwxrwxr-x. 8 root root 4096 3月 19 2019 utils
3.2、编译安装
3.2.1、下载依赖
[root@redis-server redis-4.0.14]# yum install gcc-c++ -y
3.2.2、下载epel源
# 详细下载请参考centos7下安装阿里epel源
3.2.3、执行make MALLOC=libc命令
cd /usr/local/src/redis-4.0.14
[root@redis-server redis-4.0.14]# make MALLOC=libc
如果不执行以上命令可也行会有如下报错:
In file included from adlist.c:34:0:
zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录
#include <jemalloc/jemalloc.h>
3.2.4、执行编译安装
[root@redis-server redis-4.0.14]# make
创建相关路径
# 重命名redis目录名
mv /usr/local/src/redis-4.0.14 /usr/local/src/redis
mkdir /usr/local/src/redis/{etc,logs,bin,run,data}
cd /usr/local/src/redis/src
mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server redis-trib.rb ../bin
cd /usr/local/src/redis
mv redis.conf etc
3.2.5、修改redis配置文件
# 修改之前先做备份
cp /usr/local/src/redis/etc/redis.conf /usr/local/src/redis/etc/redis.conf.bak+日期
# 修改配置文件,将136行中的daemonize no改为yes
vim /usr/local/src/redis/etc/redis.conf
134 # By default Redis does not run as a daemon. Use 'yes' if you need it.
135 # Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
136 daemonize yes
注意: 如果不修改配置文件可能会启动或连接redis失败,这是因为配置文件中,以守护进程方式启动,默认是关闭的,这是设置为允许以守护进程方式启动服务
3.2.6、启动redis服务
cd /usr/local/src/redis/src/bin
./redis-server /usr/local/src/redis/etc/redis.conf
# 查看redis服务是否启动
ps aux |grep redis
# 查看redis端口是否正常监听
netstat -anput |grep 6379
# 进入redis的控制台
cd /usr/local/src/redis/bin
./redis-cli
3.2.7、停止redis服务
cd /usr/local/src/redis/bin
./redis-cli stutdown
3.2.8、查看redis的版本
cd /usr/local/src/redis/bin
[root@redis-server bin]# ./redis-server -v
Redis server v=4.0.14 sha=00000000:0 malloc=libc bits=64 build=ad32f7d3c6c1b9ac
# 也可通过 --help查看更多参数
[root@redis-server bin]# ./redis-server --help
Usage: ./redis-server [/path/to/redis.conf] [options]
./redis-server - (read config from stdin)
./redis-server -v or --version
./redis-server -h or --help
./redis-server --test-memory <megabytes>
Examples:
./redis-server (run the server with default conf)
./redis-server /etc/redis/6379.conf
./redis-server --port 7777
./redis-server --port 7777 --slaveof 127.0.0.1 8888
./redis-server /etc/myredis.conf --loglevel verbose
Sentinel mode:
./redis-server /etc/sentinel.conf --sentinel
4、redis优化
在默认情况下redis启动后会有一些警告,正常情况下不会影响使用,但是在生产环境中随着业务访问的增加有可能是出问题,所以我安装好就将其优化掉
cd /usr/local/src/redis/bin
[root@redis-server bin]# ./redis-server /usr/local/src/redis/etc/redis.conf
16123:C 08 Apr 16:45:05.030 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
16123:C 08 Apr 16:45:05.030 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=16123, just started
16123:C 08 Apr 16:45:05.030 # Warning: no config file specified, using the default config. In order to specify a config file use ./redis-server /path/to/redis.conf
16123:M 08 Apr 16:45:05.033 * Increased maximum number of open files to 10032 (it was originally set to 1024).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 4.0.14 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 16123
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
16123:M 08 Apr 16:45:05.040 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
16123:M 08 Apr 16:45:05.040 # Server initialized
16123:M 08 Apr 16:45:05.040 # 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.
16123:M 08 Apr 16:45:05.041 # 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.
16123:M 08 Apr 16:45:05.041 * Ready to accept connections
^C16123:signal-handler (1617871641) Received SIGINT scheduling shutdown...
16123:M 08 Apr 16:47:21.651 # User requested shutdown...
16123:M 08 Apr 16:47:21.651 * Saving the final RDB snapshot before exiting.
16123:M 08 Apr 16:47:21.654 * DB saved on disk
16123:M 08 Apr 16:47:21.654 # Redis is now ready to exit, bye bye...
4.1、解决掉当前警告
4.1.1、tcp-backlog
修改/etc/sysctl.conf配置文件
# 在/etc/sysctl.conf最后添加一行如下:
vim /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
# 添加如下一行,值必须大于511
net.core.somaxconn = 1024
4.1.2、vm.overcommit_memory
0:表示内核将检查是否有足够的可用内存供应用进程使用,如果没有足够的可用内存,内存申请准许;否则内存申请失败,并把错误返回给进程。
1:表示内核允许分配所有物理内存,而不管当前内存状态如何。
2:表示内核允许分配超过所有物理内存和交换空间总和的内存。
# 最后追加一行:
vim /etc/sysctl.conf
vm.overcommit_memory = 1
# 让其生效
sysctl -p
4.1.3、transparent hugepage:
需要关闭大页内存动态分配,让redis负责内存管理。
# 修改之前查看默认参数是always
[root@redis-server ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
# 修改为never
[root@redis-server ~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@redis-server ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
# 由于服务器重启后此参数会失效,所有需要添加如下步骤
[root@redis-server bin]# vi /etc/rc.d/rc.local
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.
touch /var/lock/subsys/local
echo never > /sys/kernel/mm/transparent_hugepage/enabled
# 在centos7中/etc/rc.d/rc.loca是没有执行权限的,需要添加执行权限
[root@redis-server bin]# ll !$
ll /etc/rc.d/rc.local
-rw-r--r--. 1 root root 531 4月 8 20:30 /etc/rc.d/rc.local
[root@redis-server bin]# chmod a+x /etc/rc.d/rc.local
4.2、重启redis
cd /usr/local/src/redis/bin
[root@redis-server bin]# ./redis-server /usr/local/src/redis/etc/redis.conf
16337:C 08 Apr 20:26:29.492 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
16337:C 08 Apr 20:26:29.493 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=16337, just started
16337:C 08 Apr 20:26:29.493 # Configuration loaded
此时发现已经没有警告了
4.3、redis编译安装后的相关路径
# 启动服务路径:
server_dir=/usr/local/src/redis/bin
# 配置文件路径
redis_conf=/usr/local/src/redis/bin/etc
# pid路径
pidFile_dir=/var/run/redis.pid
# rdb快照路径,这个后边会写到
rdb=/usr/local/src/redis/data
注意: pidFile文件是可以修改位置的,我们可以通过修改以下内容来修改
vim /usr/local/src/redis/etc/redis.conf
......
158 pidfile /var/run/redis_6379.pid # 可以修改成/usr/local/src/redis/run/redis.pid
......
注意: 为什么默认的pid文件是redis_6379.pid,因为有的公司可能比较节省成本,在一台机器上跑多个redis实例,所以为了区分pid文件,所以加了端口号
4.4、修改redis配置文件
如果想从别的机器通过redis-cli命令连接到本机redis,需要做一下设置
vim /usr/local/src/redis/etc/redis.conf
# 修改69行的bind 127.0.0.1为该远程主机的地址,如果有多台可以填写多台IP地址,也可以写成0.0.0.0
69 bind 0.0.0.0
改完配置文件需要重启redis服务,然后测试从远端机器进行连接
./redis-cli -h redis服务端IP地址 -p 端口 -a 密码 # 如果有密码需要加-a后边加密码,如果没有则不需要该参数
如果需要给远端服务器连接加认证,也就是密码,则需要修改如下内容:
# 修改500行,解除注释,然后将后边的foobared改成你的认证密码,
vim /usr/local/src/redis/etc/redis.conf
498 # use a very strong password otherwise it will be very easy to break.
499 #
500 # requirepass foobared #修改前
501 requirepass 123456 #修改后
502 # Command renaming.
然后重启redis服务,然后进行测试
# 在远端主机进行访问redis服务端,192.168.1.138是服务端
[root@Ansible bin]# ./redis-cli -h 192.168.1.138 -p 6379
192.168.1.138:6379> select 1
(error) NOAUTH Authentication required.
192.168.1.138:6379> auth 123456
OK
192.168.1.138:6379> select 1
OK
认证时输入正确的密码即可
5、redis命令
5.1、 查看当前库中所有的key
redis默认是16个库,索引是从0-15,默认用的是第一个库,也就是索引是0的库
# 在redis服务器端查看当前库中所有的key
127.0.0.1:6379> keys *
1) "key-668"
2) "key-643"
3) "key-156"
4) "key-721"
5) "key-961"
6) "key-600"
7) "key-314"
8) "key-60"
9) "key-802"
......
5.2、查询key的值
127.0.0.1:6379> get key-668
"value-668"
5.3、清空当前库的所有key
# 清空当前库中的所有key值--flushdb
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty list or set)
除此之外还有更暴力的一个命令:flushall,flushall不仅会清空当前库的所有数据,还会清空所有库的数据。
注意: 此命令在生产环境慎用!!!
我们把/usr/local/src/redis/bin下的可执行脚本做个软连接到/usr/bin,这样我们不用每次都到特定目录才能执行脚本文件
[root@redis-server bin]# ln -s /usr/local/src/redis/bin/redis* /usr/bin/
注意: 做软连接一定要用绝对路径,相对路径不会生效的!
说明: 笔记是参考马哥视频整理出来的,如有侵权请联系删除!