# Redis

Redis(Remote dictionary server)远程字典服务,远程服务指的是Redis本身也是一个Web服务,字典指的是Redis自身提供的服务是键值对key-value字典的读写。

# Redis数据结构

结构类型 说明
String字符串 最基本的数据类型,二进制安全的字符串
List集合 按照添加顺序保持顺序的字符串列表
Hash散列 key-value对的一种集合
Set无序集合 无序的字符串集合,不存在重复的元素
ZSet有序集合 已排序的字符串集合

# String类型

String字符串类型,是redis中最简单的存储类型。可以分为三类:String(普通字符串),Int(整数类型,可以做自增以及自减操作),Float(浮点类型,可以做自增以及自减操作)

  • SET key value
    添加key-value,如果key不存在表示添加操作,key存在表示修改操作。
  • GET key
    根据key获取value
  • MSET key value [key value ...]
    批量添加key-value,如果某个Key存在也同样会覆盖原来的value值
  • MGET key [key ...]
    批量获取多个key的value值
  • INCR key
    整型自增1
  • INCRBY key increment
    整型自增指定值
  • INCRBYFLOAT key increment
    浮点数自增指定步长
  • SETNX key value
    不存在才添加
  • SETEX key value seconds
    添加key-value并设置有效期

# Hash类型

hash类型数据结构在redis中指的是key-value结构中的value本身也是key-value形式存储的结构。

  • HSET key field value
    添加或者修改hash类型key的field值
  • HGET key field
    获取一个hash类型key的field值
  • HMSET
    批量添加多个hash类型key的field值
  • HMGET
    批量获取多个hash类型key的field值
  • HGETALL
    获取一个hash类型key中的所有field以及value
  • HKEYS
    获取一个hash类型Key中的所有field
  • HVALS
    获取一个hash类型key中的所有value
  • HINCRBY
    让一个hash类型key的字段值自增并且指定步长
  • HSETNX
    添加一个hash类型key的field值(仅field不存在才会执行)

# List类型

Redis中的List类型是一个双向的链表结构,可以从两端进行push以及pop操作。

  • LPUSH key element ...
    向列表左端插入一个或者多个元素
  • LPOP key
    移除并返回左端第一个元素,没有返回nil
  • RPUSH key element ...
    向列表右端插入一个或者多个元素
  • RPOP key
    移除并返回右端第一个元素,没有返回nil
  • LRANGE key start end
    返回角标start到end范围的所有元素
  • BLOPO和BRPOP
    和LPOP以及RPOP类似,只不过在没有元素的时候会等待指定时间

# Set类型

Redis中的Set结构与Java中的HashSet类似。特点都是哈希以及去重。

  • SADD key
    添加元素
  • SREM key
    移除元素
  • SCARD key
    返回set中元素的个数
  • SISMEMBER key member
    判断一个元素是否在set集合中
  • SMEMBERS
    获取set集合中的所有元素
  • SINTER key1 key2
    求key1与key2的交集
  • SDIFF key1 key2
    求key1和key2的差集
  • SUNION key1 key2
    求key1和key2的并集

# ZSet类型

  • ZADD key score member
    添加一个到多个元素到ZSet中
  • ZREM key member
    删除一个指定元素
  • ZSCORE key member
    获取集合中指定元素的score值
  • ZRANK key member
    获取指定元素的排名
  • ZCARD key
    获取集合中的元素个数
  • ZCOUNT key min max
    统计score值在指定区间的元素个数
  • ZINCRBY key increment member
    让指定元素自增指定步长
  • ZRANGE key min max
    按照score排序后,获取指定排名的元素
  • ZRANGEBYSCORE key min max
    按照score排序后,获取指定score区间的元素
  • ZINTER key1 key2
    求key1与key2的交集
  • ZDIFF key1 key2
    求key1和key2的差集
  • ZUNION key1 key2
    求key1和key2的并集

# Redis安装

下面以centos为例讲解redis的安装,密码设置,验证安装结果,登录redis。

# 下载redis安装包
apt-get install redis-server
# 找到redis配置文件并修改
vim /etc/redis/redis.conf
# 找到如下配置项,移除前面的#号,使配置生效,这里的foobared就是对应的密码
requirepass foobared
# 启动redis
systemctl start redis-server
# 查看redis状态
systemctl status redis-server
# 设置开机自启
systemctl enable redis-server
# 验证redis是否启动完成
redis-cli ping
# 连接redis验证(登录redis)
redis-cli -p 6379 -a password
# 可选操作-重启redis
systemctl restart redis.service

# Redis登录

可以通过redis-cli指令登录redis。

# --raw以原始形式显示数据,加了之后能查看中文,不加只能看到\xe4\xb8形式的数据
root@test:/data# redis-cli -p 6379 -a password --raw
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> keys DEPARTMENT:*

# Redis命令

# SET-添加字符串类型key-value

SET key value

# GET-获取字符串类型value

root@test:/data# redis-cli -p 6379 -a password
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# 通过get key来查看value
127.0.0.1:6379> get "DEPARTMENT:20191115142730138-03DA-4DBF7E1C7"

# LPUSH-列表List头部添加数据

LPUSH key [element...]

# LRANGE-列表List头部查询数据

LRANGE key start stop

# LPOP-列表List头部取出数据

LPOP key nums

# RPUSH-列表List尾部添加数据

RPUSH key [element...]

# RRANGE-列表List尾部查询数据

RRANGE key start stop

# RPOP-列表List尾部取出数据

RPOP key nums

# SADD-Set集合添加数据

SADD key [elements...]

# SMEMBERS-查看Set集合数据

SMEMBERS key

# SISMEMBER-判断value是否在Set集合

SISMEMBER key value

# SREM-删除Set集合中的value

SREM key value

# ZADD-ZSet集合添加数据

# key后面每个元素都要提供一个数字用于排序
ZADD key [number element]...

# ZRANGE-ZSet集合查询数据

ZRANGE key start stop

# HSET-添加哈希数据

HSET key key1 value1

# HGET-获取哈希数据

HGET key key1

# HDEL-删除哈希数据

HDEL key key1

# DEL-删除key-value

root@test:/data# redis-cli -p 6379 -a password
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# 通过del key来删除value
127.0.0.1:6379> DEL "DEPARTMENT:20191115142730138-03DA-4DBF7E1C7"

# FLUSHALL-删除所有key-value

# 不建议使用
FLUSHALL

# EXISTS-判断key是否存在

DEL key

# KEYS-查看redis中的键

通过keys可以查看redis里都有哪些keys。

root@test:/data# redis-cli -p 6379 -a password
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# 查看所有以DEPARTMENT:开头的keys
127.0.0.1:6379> keys DEPARTMENT:*
# 查看所有的keys
127.0.0.1:6379> keys *

# EXPIRE-设置过期时间

在redis中,默认key的过期时间是-1,即永不过期,我们可以在创建key的同时为key设置过期时间,也可以为现有key设置过期时间。

# 在创建key的同时设置过期时间

# 这里以字符串类型的key-value为例说明,过期时间单位为秒
set key value EX seconds
# 查看key的过期时间
TTL key

# 为已经存在的key设置过期时间

# 设置已经存在的key的过期时间
EXPIRE key seconds

# PERSIST-设置key永不过期

# 设置key永不过期
PERSIST key

# TTL-查看key的过期时间

# 查看key的过期时间
TTL key

# Docker容器下Redis登录密码修改

在默认情况下,我们修改redis.conf即可修改redis密码,在Docker环境下,我们可以在启动容器时设置参数来修改密码。

docker run --name some-redis -d redis redis-server --requirepass yourpassword

# Redis主从复制

Redis主从复制模式下,需要修改从节点的配置文件,在配置里写入主节点的IP地址以及端口等信息即可。生产环境Redis主从复制的方式不常用,比较常见的是哨兵模式的集群框架。

# Redis哨兵模式常用

在Redis哨兵模式下,我们不需要为每一个Redis节点配置主从关系,这些操作由哨兵完成。原则上我们使用一个哨兵节点也可以管理Redis主从集群,但是集群架构下,哨兵最好也是集群架构,即哨兵集群。生产环境下比较常见的是3个Redis服务以及3个哨兵服务的集群架构。

# Redis里都存储了哪些业务数据

在我的系统里,Redis里存储了用户信息,部门信息,角色信息,数据字典(i18n国际化信息),登录的Token,这些信息都是永久存储的。此外,还使用了Redis做分布式锁,锁资源会设置过期时间。

# 项目中使用Redis(Spring Data Redis)

Java一分钟之-Spring Data Redis:使用Redis做缓存 (opens new window)