Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

  • Redis 与其他 key - value 缓存产品有以下三个特点:
  1. Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  2. Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  3. Redis支持数据的备份,即master-slave模式的数据备份。

关键词

  1. C语言编写, NoSQL
  2. 持久化:AOF,RDB
  3. 支持事务,原子性
  4. 可主从赋值,分布式缓存,高可用,并发10W QPS
  5. 单进程单线程,是线程安全的,采用 IO 多路复用机制

为什么用

  1. 高并发,高性能
  2. Java 自带的 缓存不具有一致性, redis 或 memcached 之类的称为分布式缓存
  3. Redis 直接自己构建了 VM 机制
  4. 支持数据持久化。可以将内存中数据保存在磁盘中,重启时加载。主从复制,哨兵,高可用。可以用作分布式锁。可以作为消息中间件使用,支持发布订阅。

存储

1. RDB:Redis DataBase 快照

按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。通过配置文件中的save参数来定义快照的周期。

2. AOF:Append Only File 持久化

将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据。

  • 当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。

数据类型

Redis主要有5种数据类型,包括String,List,Set,Zset,Hash,满足大部分的使用要求

redis 随机 hash redis随机取数据_redis

存储Java 对象

  1. 利用序列化和反序列化
  2. 将java对象转换为json字符串,利用json与java对象之间可以相互转换的方式进行存值和取值

参考:

初次体验

windows版本

运行 Redis

redis-server.exe redis.windows.conf

redis 随机 hash redis随机取数据_数据_02

再开一个cmd

redis-cli.exe -h 127.0.0.1 -p 6379

redis 随机 hash redis随机取数据_redis_03

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-sclyum -y install devtoolset-9-gcc devtoolset-9-gcc-c++devtoolset-9-binutilsscl 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

后台运行 服务端

  1. 修改 配置 文件 ,后台 启动
vim /etc/redis.conf

找到 daemonize 属性 将no改为yes
注释掉 #bin 127.0.0.1

  1. 启动
src/redis-server /etc/redis.conf &
  1. 关闭
redis-cli -h 127.0.0.1 -p 6379 shutdown
redis-cli -h 127.0.0.1 -p 6379 -a password shutdown

更改配置文件

  1. 直接修改 redis.conf 文件并重启
  2. 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

  1. debug:会打印出很多信息,适用于开发和测试阶段
  2. verbose(冗长的):包含很多不太有用的信息,但比debug要清爽一些
  3. notice:适用于生产模式
  4. warning : 警告信息