Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
- Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
关键词
- C语言编写, NoSQL
- 持久化:AOF,RDB
- 支持事务,原子性
- 可主从赋值,分布式缓存,高可用,并发10W QPS
- 单进程单线程,是线程安全的,采用 IO 多路复用机制
为什么用
- 高并发,高性能
- Java 自带的 缓存不具有一致性, redis 或 memcached 之类的称为分布式缓存
- Redis 直接自己构建了 VM 机制
- 支持数据持久化。可以将内存中数据保存在磁盘中,重启时加载。主从复制,哨兵,高可用。可以用作分布式锁。可以作为消息中间件使用,支持发布订阅。
存储
1. RDB:Redis DataBase 快照
按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。通过配置文件中的save参数来定义快照的周期。
2. AOF:Append Only File 持久化
将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据。
- 当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。
数据类型
Redis主要有5种数据类型,包括String,List,Set,Zset,Hash,满足大部分的使用要求
存储Java 对象
- 利用序列化和反序列化
- 将java对象转换为json字符串,利用json与java对象之间可以相互转换的方式进行存值和取值
参考:
初次体验
windows版本
运行 Redis
redis-server.exe redis.windows.conf
再开一个cmd
redis-cli.exe -h 127.0.0.1 -p 6379
centos 7版本
建议下载版本 3:http://download.redis.io/releases/
$ wget http://download.redis.io/releases/redis-6.0.6.tar.gz
$ tar xzf redis-6.0.6.tar.gz
$ cd redis-6.0.6
$ make
如果出现报错:
yum -y install gcc automake autoconf libtool make
安装Redis 6.0以上版本需要升级gcc到5.3及以上,先检查gcc的版本是否低于5,如果是请先升级yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++
devtoolset-9-binutils
scl enable devtoolset-9 bash
需要注意的是scl命令启用只是临时的,退出shell或重启就会恢复原系统gcc版本。
如果要长期使用gcc 9.3的话:echo “source /opt/rh/devtoolset-9/enable” >>/etc/profile
清理上次编译残留文件,重新编译,否则会报错make distclean && make
The binaries that are now compiled are available in the src directory. Run Redis with:
$ src/redis-server redis.conf
后台启动 设置 redis.conf,daemonize的值改成yes即可
You can interact with Redis using the built-in client: (重新打开一个客户端)
$ src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
配置文件 redis.conf
如果是 哨兵结点,就是 sentinel.conf 文件
# 哨兵结点配置 在 sentinel.conf
sentinel monitor mymaster 10.1.4.141 6379 2
# slave 结点配置
slaveof 10.1.4.141 6379
#
port 6379
#
daemonize yes
#
#bind 0.0.0.0
# 日志相关
loglevel notice
logfile ""
# RDB 配置
# 在[seconds]秒内如果发生了[changes]次数据修改,则进行一次RDB快照保存
# 可以配置多条save指令,让Redis执行多级的快照保存策略。
save [seconds] [changes]
#
dbfilename "dump-6379.rdb"
# AOF 默认是关闭的
# appendfsync no:不进行fsync,将flush文件的时机交给OS决定,速度最快
# appendfsync always:每写入一条日志就进行一次fsync操作,数据安全性最高,但速度最慢
# appendfsync everysec:折中的做法,交由后台线程每秒fsync一次
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
# 内存管理
maxmemory <bytes>
# 淘汰机制
#Redis提供了5种数据淘汰策略:
# volatile-lru:使用LRU算法进行数据淘汰(淘汰上次使用时间最早的,且使用次数最少的key),只淘汰设定了有效期的
# key allkeys-lru:使用LRU算法进行数据淘汰,所有的key都可以被淘汰
# volatile-random:随机淘汰数据,只淘汰设定了有效期的
# key allkeys-random:随机淘汰数据,所有的key都可以被淘汰
# volatile-ttl:淘汰剩余有效期最短的key
maxmemory-policy volatile-lru
后台运行 服务端
- 修改 配置 文件 ,后台 启动
vim /etc/redis.conf
找到 daemonize 属性 将no改为yes
注释掉 #bin 127.0.0.1
- 启动
src/redis-server /etc/redis.conf &
- 关闭
redis-cli -h 127.0.0.1 -p 6379 shutdown
redis-cli -h 127.0.0.1 -p 6379 -a password shutdown
更改配置文件
- 直接修改 redis.conf 文件并重启
-
CONFIG
命令
通过redis-cli
进入redis后输入 eg:SET loglevel "notice"
查配置,eg:config get stop-writes-on-bgsave-error
使用 * 号获取所有配置项:CONFIG GET *
Memcache和redis的区别:
数据支持的类型:
- redis不仅仅支持简单的k/v类型的数据,同时还支持list、set、zset、hash等数据结构的存储;
- memcache只支持简单的k/v类型的数据,key和value都是string类型可靠性:memcache不支持数据持久化,断电或重启后数据消失,但其稳定性是有保证的;redis支持数据持久化和数据恢复,允许单点故障,但是同时也会付出性能的代价性能上:对于存储大数据,memcache的性能要高于redis
应用场景:
- Memcache:适合多读少写,大数据量的情况(一些官网的文章信息等)
- Redis:适用于对读写效率要求高、数据处理业务复杂、安全性要求较高的系统
- 案例:分布式系统,存在session之间的共享问题,因此在做单点登录的时候,我们利用redis来模拟了session的共享,来存储用户的信息,实现不同系统的session共享;
Redisson 客户端
使用Java 客户端 连接
public static void main(String[] args) {
Config config = new Config();
config.setCodec(new org.redisson.client.codec.StringCodec());
config.useSingleServer()
.setAddress("http://127.0.0.1:6379");
RedissonClient redisson = Redisson.create(config);
RBucket<String> keyObject = redisson.getBucket("k2");
keyObject.set("v2");
System.out.println(keyObject.get());
redisson.shutdown();
}
redis 常用命令
- 查看所有key
keys *
安全
查看是否设置密码
我们可以通过以下命令查看是否设置了密码验证:
127.0.0.1:6379> CONFIG get requirepass
1) "requirepass"
2) ""
默认情况下 requirepass 参数是空的,这就意味着你无需通过密码验证就可以连接到 redis 服务。
设置密码
127.0.0.1:6379> CONFIG set requirepass "你的密码"
OK
密码登录
127.0.0.1:6379> AUTH password
OK
127.0.0.1:6379> CONFIG get requirepass
Redis设置密码重启后失效
1.只是单纯的通过命令行设置了密码,这种设置方式是临时的,当服务器重启后,密码会失效。
config set requirepass yourPassword
解决方案:在redis的配置文件中直接配置密码
配置文件中有一行是这样的
# requirepass foobared
去掉注释,并且把foobared改为自己的密码
如:requirepass 123
2.如果你已经按照上面的方法在配置文件中设置了密码,但启动后仍旧无效,说明你肯定没有指定配置文件运行。服务端也会报出如下警告:
Warning: no config file specified, using the default config.
windows下正确的启动方式:redis-server.exe redis.windows.conf
在指定了配置文件后,再启动就可以读取到设置的密码了。
命令重命名
配置文件中 找到 SECURITY
区域
- 禁用命令
rename-command KEYS ""
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
- 重命名命令
rename-command KEYS "XXXXX"
rename-command FLUSHALL "XXXXX"
rename-command FLUSHDB "XXXXX"
rename-command CONFIG "XXXXX"
redis日志配置
配置文件 redis.conf
logfile "/usr/redis/log/redis.log"
- 在redis目录下新建一个log文件夹再建一个redis.log文件
- 重启项目发现启动日志已经从控制台转到日志文件中了。
- redis日志分为4个级别
Redis4默认的设置为notice,开发测试阶段可以用debug(日志内容较多一般不建议使用),生产模式一般选用notice
- debug:会打印出很多信息,适用于开发和测试阶段
- verbose(冗长的):包含很多不太有用的信息,但比debug要清爽一些
- notice:适用于生产模式
- warning : 警告信息