Redis

概述

NoSQL泛指非关系型数据库,采用区别于非关系型数据库的设计.主要针对关系型数据库的缺陷来设计.

  • 键值存储:Redis多用于项目的高速缓存
  • 文档存储:MongoDB多用于社交类型的应用
  • 文件存储: FastDFS 多用于以文件为载体的在线服务,如相册网站/视频网站等等
  • 列式存储: HBase 主要用于数据分析领域

Redis的数据结构

Redis属于键值存储的NoSQL数据库.一个极其高性能的超大map

缺陷:

  • Redis中事务只有同时成功,没有同时失败.
  • 没有表的概念和表相关的操作
  • 单线程执行,没有并发的线程安全问题

五大数据类型

  • string
  • hash
  • list
  • set
  • zset

特点

  • 性能高,能高达10w次读/s,8w次写/s
  • 具有比较简单的acid
  • 单线程,每个操作都是原子操作,acid

Redis支持的数据类型

string类型

命令 作用
set key value 存入键值对
get key 根据键取出值
getset key value 返回旧值后存入新值
incr key 把值递增1
decr key 把值递减1
incrby key num 偏移值
append key ‘value’ 在原值后拼接新内容
setnx key value 存入键值对,键存在时不存入
setex key timeout value 存入键值对,timeout表示失效时间,单位s
setrange key index value 存入键值对,timeout表示失效时间,单位s
setex key timeout value 批量存入键值对
setex key timeout value 批量取出键值
del key 批量取出键值

hash类型

命令 作用
hset key hashkey hashvalue 存入一个hash对象
hget key hashkey 根据hash对象键去取值
hincrby key hashkey 递增值,递增hashkey对应的值
hexists key hashkey 判断hash对象是含有某个键
hlen key 获取hash对象键的数量
hkeys key 获取hash对象的所有键
hvals key 获取hash对象的所有值
hgetall key 获取hash对象的所有数据
hdel key hashkey 根据hashkey删除hash对象键值对

同样有hsetnx,其作用跟用法和setnx一样

list类型

命令 作用
rpush key value 往列表右边添加数据
lpush key value 往列表左边添加数据
lpop key value 弹出列表左边的数据
rpop key value 弹出列表右边的数据
lrange key start end 范围显示列表数据,全显示则设置0 -1
linsert key before/after refVal newVal 参考值之前/之后插入数据
lset key index value 根据索引修改数据
lrem key count value 在列表中按照个数删除数据
ltrim key start end 范围截取列表
lindex key index 范围截取列表
ltrim key start end 范围截取列表

set类型

命令 作用
sadd key value 往set集合中添加元素
smembers key 列出set集合中的元素
srem key value 删除set集合中的元素
spop key count 随机弹出集合中的元素
sdiff key1 key2 返回key1中特有元素
sdiffstore var key1 key2 返回key1中特有的元素存入另一个set集合
sinter key1 key2 返回两个set集合的交集
sinterstore var key1 key2 返回两个set集合的交集存入另一个set集合
sunion key1 key2 返回两个set集合的并集
sunionstore var key1 key2 返回两个set集合的并集并存入另一个set集合
smove key1 key2 value 把key1中的某元素移入key2中
scard key 返回两个set集合的并集
sismember key value 返回两个set集合的并集
srandmember key count 随机获取set集合中的元素

zset类型

命令 作用
zadd key num name 存入数值和名称
zrange key start end 按照数值升序输出名称
zrangebyscore key min max [withscore] 按照数值范围降序输出名称
zrem key name 删除名称和数值
zincrby key num name 偏移名称对应的数值
zrank key name 升序返回排名
zrevrank key name 降序返回排名
zremrangebyscore key min max [withscores] 根据分数范围删除元素
zremrangebyrank key start end 根据排名删除元素
zremrangebyrank key start end 根据排名删除元素
zremrangebyrank key start end 根据排名删除元素

Redis的管理命令

命令 作用
exists key 判断某个key是否存在
expire key 设置key的过期时间
persist key 取消key的过期时间
select index 切换数据库索引,范围是0 ~ 15共16个分区
move oldkey newkey 把oldkey重命名为newkey
info 查看当前服务器信息
flushdb 清空当前库中的数据
flushall 清空所有库中的数据

Redis缓存

1
2
3
4
5
6
7
8
9
10
11
12
//业务层方法
public User get(Long id) {
User user = null; //避免多个对象的key一致,采用全限定名:id的形式来作为缓存的key String cacheKey = "cn.wolfcode.xxx.domain.User:"+id; //从redis中取出数据
String cacheVal = jedis.get(cacheKey);
if (cacheVal == null) {
//redis中没有数据,再从关系型数据库中查询
user = userMapper.selectByPrimaryKey(id); //把查询到的结果存到redis中
jedis.set(cacheKey, JSON.toJSONString(user));
} else { //redis中有数据,再把该数据解析成一个User对象 user = JSON.parse(cacheVal, User.class);
}
return user;
}

Redis集群模式

image-20190628215358982

哨兵模式,如果发现master宕机,就会在剩下的服务器中,通过选举算法选择其他服务器

image-20190628215516714