not only sql,为了和关系型数据库区分,泛指非关系型数据库
- 列存储:Hbase
- Key-Value存储:Redis
- 文档存储:MongoDB
- 图存储:Neo4J
- 对象存储:MiniO
- xml存储
基于内存存储的键值对数据库。
数据存在内存中,多种数据类型,键值对存储
应用场景
1. 有效期数据
2. 数据缓存
3. 共享数据
mkdir -p /docker/redis/redis6379
redis.conf
,默认设置密码:******
docker run -d --name redis6379 -p 6379:6379 -v /docker/redis/redis6379/redis.conf:/etc/redis/redis.conf redis:6.2.1 redis-server /etc/redis/redis.conf
docker exec -it redis6379 bash
, redis-cli
, auth pasword
]String 字符串
List 集合,元素可重复,保证有序
Set 集合,元素不可重复,⽆序
Hash 集合,键值对,键唯一
SortSet 集合,等价于Map
Stream 集合,流、记录的事件发展流程
Geo 集合,记录经纬度
BitMap 数组,字节(0 or 1)
HyperLogLog 算法,统计基数
常用7种:string、list、set、hash、geo、bitmap、sortset
值是单个的,有效期
操作
命令 | 含义 |
---|---|
set key value | 设置内容,若无为新增,有则为修改 |
get key | 获取内容 |
lncr key | 自增1 |
decr key | 自减1 |
incrby key val | 自增val值 |
decrby key val | 自减val值 |
getdel key | 获取并删除 |
append key | 追加 |
setex key seconds value | 设置内容和有效时间 |
值的类型是List集合,可以存储多个元素,值是多个的,元素有序,可重复,保证添加顺序
命令 | 含义 |
---|---|
lpush key 元素… | 从左边(头部)添加元素 |
rpush key 元素… | 从右边(尾部)添加元素 |
lpop key | 获取并删除第一个数据 |
rpop key | 获取并删除最后一个数据 |
lrange key start end | 获取索引范围内的内容 |
llen key | 获取元素个数 |
值的类型是Set集合,值是多个的,元素⽆序,不可重复
命令 | 含义 |
---|---|
sadd key value | 新增元素 |
smemebers key | 获取所有元素 |
srem key value | 删除指定元素 |
scard key | 查询元素 |
sismenmber key value | 验证元素是否存在 |
siner key1 key2 | 交集(共同拥有饭) |
sdiff key1 key2 | 差集(一个中有,另一个中没有) |
sunion key1 key2 | 并集(所有) |
值的类型是Hash,其实就是Java中Map集合Map
命令 | 含义 |
---|---|
hset key field value | 新增元素 |
hget key field | 获取指定字段值 |
hgetall key | 获取所有元素 |
hexists key field | 验证字段是否存在 |
hkeys key | 获取所有fields |
hvals key | 获取所有的值 |
hdel key field | 删除指定的字段 |
值的类型是特殊的Map集合,等价于:Map
分数可以是小数,可重复,元素类型任意,不可重复
命令 | 含义 |
---|---|
zadd key score value | 新增元素 |
zcount key start分数 end分数 | 获取指定分数内的元素数量 |
zcard key | 获取元素个数 |
zrange key startindex endindex | 获取指定索引内的元素 |
zrevrange key startindex endindex | 获取指定索引内的元素,按分数降序排列 |
zrem key value | 删除元素 |
存储多个地点信息:1.经度(纵向) 2.纬度(横向) 3.地点名称
命令 | 含义 |
---|---|
geoadd key 经度 纬度 地点名称 | 新增地理位置 |
geopos key 地点名称 | 获取地点对应的经纬度 |
geodlist key 地点1 地点2 单位(M,KM…) | 计算两个地点间距离 |
geiradius key 经度 纬度 半径 单位 | 获取指定经纬度匹配半径内的地点信息 |
bit数组,0或1,默认是0
命令 | 含义 |
---|---|
setbit key index value | 设置指定索引的值,设置为1 |
getbit key index | 获取指定索引的值 |
bitcount key | 获取1的数量 |
命令 | 含义 |
---|---|
auth password | 验证密码 |
ttl key | 查询剩余有效期 |
del key | 删除key |
expire key 秒数 | 设置key有效期 |
Exists key | 验证key是否存在 |
keys * | 匹配所有的key,支持模糊匹配 |
scan index MATCH * | 代替keys * |
select 数据库索引 | 切换数据库,默认16个库,索引从0开始 |
依赖jar包
<dependency>
<groupId>redis.clientsgroupId>
<artifactId>jedisartifactId>
dependency>
代码
// 连接
Jedis jedis = new Jedis("host",port);
jedis.auth("password");
// 操作
jedis.操作...
看门狗,适用于集群,内部实现分布式锁、布隆过滤器
依赖jar包
<dependency>
<groupId>org.redissongroupId>
<artifactId>redissonartifactId>
<version>3.16.4version>
dependency>
代码
// 连接
Config config = new Config();
config.useSingleServer().setAddress("redis://host:6379").setPassword("password");
RedissonClient client = Redisson.create(config);
// 操作
client.操作
属于Spring体系下的Spring Data框架(Spring针对数据源封装的很多⼩框架,操作不同的数据源)中的⼀种。
依赖jar
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
dependency>
实现配置
spring:
redis:
hostL:host
port:6379
password:password
代码
@SpringBootTest
public class DataRedisTest {
@Autowired
private StringRedisTemplate redisTemplate;
@Test
public void t1(){
//String类型
redisTemplate.boundValueOps("a").set("a");
//Hash类型
redisTemplate.boundHashOps("b").put("1","b");
//List类型
redisTemplate.boundListOps("c").leftPush("c");
System.err.println(redisTemplate.boundListOps("d").leftPop(1));
//Set类型
redisTemplate.boundSetOps("e").add("a","b");
}
}
作用:Redis数据存储在内存中,为了防止服务器宕机或关闭,导致内存数据丢失,持久化是把内存数据存储到硬盘上,当Redis重新启动时,加载硬盘的数据文件,可以保证内存数据不会因为宕机而丢失。
持久化方案:1.RDB 2.AOF
语法格式:save 秒数 改变的数量
- 默认的持久化机制
- RDB持久化文件,速度较快
- 存储文件为二进制文件,传输方便
- 直接把内存数据存储到二进制文件中,dump.rdb
语法格式:appendfsync always
(每执⾏⼀个写操作,⽴即持久化到AOF⽂件中,性能⽐较低);appendfsync everysec
(每秒执⾏⼀次持久化)
- 默认关闭
- 存储操作命令,速度相对比较慢
作用:处理多个命令,要么都提交,要么取消
事务生效需要配置watch监听机制,开启事务前,先通过watch去监听一个或多个key,开启事务后,有其他客户端修改key后事务会自动取消
作用 | 命令 |
---|---|
开启事务 | multi |
提交事务 | exec |
回滚事务 | discard |
主从复制实现主库数据写入,自动同步数据到所有从库
解决的问题
存在的问题
哨兵机制为了解决主从复制中的主库宕机无法写入新数据的问题,一旦主库宕机,会从从库中选举一个作为主库,通过更改从库的连接
解决问题
存在的问题
Redis-Cluster(去中心化集群):实现多主多从,可以解决并发量和数据存储问题
详述
- Redis集群是无中心的。
- Redis集群有一个ping-pang机制。
- 投票机制,Redis集群节点的数量必须是2n+ 1.
- Redis集群中默认分配了16384个hash槽,在存储数据时,就会将key进行crc16的算法,并且对16384取余,根据最终的结果,将key-value存放到指定Redis节点中,而且每一个Redis集群都在维护着相应的hash槽
- 为了保证数据的安全性,每一个集群的节点,至少要跟着一个从节点。
- 单独的针对Redis集群中的某一个节点搭建主从。
- 当Redis集群中,超过半数的节点若机之后,Redis集群就瘫痪了。
Redis为key设置有效期,Redis的过期策略用来解决有效期结束的key
解决Redis服务器内存不足时,新增数据的处理
指定淘汰机制的⽅式:
maxmemory-policy 具体策略,设置Redis的最⼤内存:maxmemory 字节⼤⼩
操作 | 解释 |
---|---|
volatile-lru | 在内存不⾜时,Redis会在设置过了⽣存时间的key中⼲掉⼀个最近最少使⽤的key |
allkeys-lru | 在内存不⾜时,Redis会在全部的key中⼲掉⼀个最近最少使⽤的key |
volatile-lfu | 在内存不⾜时,Redis会在设置过了⽣存时间的key中⼲掉⼀个最近最少频次使⽤的key |
allkeys-lfu | 在内存不⾜时,Redis会再全部的key中⼲掉⼀个最近最少频次使⽤的key |
volatile-random | 在内存不⾜时,Redis会再设置过了⽣存时间的key中随机⼲掉⼀个 |
allkeys-random | 在内存不⾜时,Redis会再全部的key中随机⼲掉⼀个 |
volatile-ttl | 在内存不⾜时,Redis会在设置过了⽣存时间的key中⼲掉⼀个剩余⽣存时间最少的key |
noeviction | (默认)在内存不⾜时,直接报错 |