# 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做分布式锁,锁资源会设置过期时间。