Redis总结

简述

NoSql概述

not only sql,为了和关系型数据库区分,泛指非关系型数据库

  1. 列存储:Hbase
  2. Key-Value存储:Redis
  3. 文档存储:MongoDB
  4. 图存储:Neo4J
  5. 对象存储:MiniO
  6. xml存储

Redis概述

  • 基于内存存储的键值对数据库。

  • 数据存在内存中,多种数据类型,键值对存储

应用场景
1. 有效期数据
2. 数据缓存
3. 共享数据

Docker安装Redis

  1. 根目录下创建文件夹:mkdir -p /docker/redis/redis6379
  2. 上传配置文件:redis.conf,默认设置密码:******
  3. 执行命令创建并运行: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
  4. 访问测试:执行命令[docker exec -it redis6379 bash, redis-cli, auth pasword]

数据类型

  1. String 字符串

  2. List 集合,元素可重复,保证有序

  3. Set 集合,元素不可重复,⽆序

  4. Hash 集合,键值对,键唯一

  5. SortSet 集合,等价于Map<Object,Double>

  6. Stream 集合,流、记录的事件发展流程

  7. Geo 集合,记录经纬度

  8. BitMap 数组,字节(0 or 1)

  9. HyperLogLog 算法,统计基数

常用7种:string、list、set、hash、geo、bitmap、sortset

String

值是单个的,有效期

操作

命令含义
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 集合

值的类型是List集合,可以存储多个元素,值是多个的,元素有序,可重复,保证添加顺序

命令含义
lpush key 元素…从左边(头部)添加元素
rpush key 元素…从右边(尾部)添加元素
lpop key获取并删除第一个数据
rpop key获取并删除最后一个数据
lrange key start end获取索引范围内的内容
llen key获取元素个数

Set 集合

值的类型是Set集合,值是多个的,元素⽆序,不可重复

命令含义
sadd key value新增元素
smemebers key获取所有元素
srem key value删除指定元素
scard key查询元素
sismenmber key value验证元素是否存在
siner key1 key2交集(共同拥有饭)
sdiff key1 key2差集(一个中有,另一个中没有)
sunion key1 key2并集(所有)

Hash 集合

值的类型是Hash,其实就是Java中Map集合Map<Object,Object>,Field–Value,其中Field唯⼀,Value可以重复,键值对组成

命令含义
hset key field value新增元素
hget key field获取指定字段值
hgetall key获取所有元素
hexists key field验证字段是否存在
hkeys key获取所有fields
hvals key获取所有的值
hdel key field删除指定的字段

SortSet类型

值的类型是特殊的Map集合,等价于:Map<Object,Double>,每个元素都⼀个对应的分数(Score),可以根据分数进⾏排序。

分数可以是小数,可重复,元素类型任意,不可重复

命令含义
zadd key score value新增元素
zcount key start分数 end分数获取指定分数内的元素数量
zcard key获取元素个数
zrange key startindex endindex获取指定索引内的元素
zrevrange key startindex endindex获取指定索引内的元素,按分数降序排列
zrem key value删除元素

Geo 集合

存储多个地点信息:1.经度(纵向) 2.纬度(横向) 3.地点名称

命令含义
geoadd key 经度 纬度 地点名称新增地理位置
geopos key 地点名称获取地点对应的经纬度
geodlist key 地点1 地点2 单位(M,KM…)计算两个地点间距离
geiradius key 经度 纬度 半径 单位获取指定经纬度匹配半径内的地点信息

BitMap 数组

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开始

Java操作Redis

Jedis

  1. 依赖jar包

    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
    </dependency>
    
  2. 代码

    // 连接
    Jedis jedis = new Jedis("host",port);
    jedis.auth("password");
    // 操作
    jedis.操作...
    

Redisson

看门狗,适用于集群,内部实现分布式锁、布隆过滤器

  1. 依赖jar包

    <dependency>
        <groupId>org.redisson</groupId>
        <artifactId>redisson</artifactId>
        <version>3.16.4</version>
    </dependency>
    
  2. 代码

    // 连接
    Config config = new Config();
    config.useSingleServer().setAddress("redis://host:6379").setPassword("password");
    RedissonClient client = Redisson.create(config);
    // 操作
    client.操作
    

Spring Data Redis

属于Spring体系下的Spring Data框架(Spring针对数据源封装的很多⼩框架,操作不同的数据源)中的⼀种。

  1. 依赖jar

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    
  2. 实现配置

    spring:
    	redis:
    		hostL:host
    		port:6379
    		password:password
    
  3. 代码

    @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数据存储在内存中,为了防止服务器宕机或关闭,导致内存数据丢失,持久化是把内存数据存储到硬盘上,当Redis重新启动时,加载硬盘的数据文件,可以保证内存数据不会因为宕机而丢失。

持久化方案:1.RDB 2.AOF

RDB

语法格式:save 秒数 改变的数量

  • 默认的持久化机制
  • RDB持久化文件,速度较快
  • 存储文件为二进制文件,传输方便
  • 直接把内存数据存储到二进制文件中,dump.rdb
AOF

语法格式:appendfsync always(每执⾏⼀个写操作,⽴即持久化到AOF⽂件中,性能⽐较低);appendfsync everysec(每秒执⾏⼀次持久化)

  • 默认关闭
  • 存储操作命令,速度相对比较慢

事务

作用:处理多个命令,要么都提交,要么取消

  • 开始事务后,执行的所有命令,都加入到队列中,只要提交事务,才按照次序执行命令。若取消后,则不执行,同时销毁队列

事务生效需要配置watch监听机制,开启事务前,先通过watch去监听一个或多个key,开启事务后,有其他客户端修改key后事务会自动取消

作用命令
开启事务multi
提交事务exec
回滚事务discard

集群策略

1.主从复制

主从复制实现主库数据写入,自动同步数据到所有从库

  • 主库:可以写入,查询Master
  • 从库:可以查询只读库Slaver

解决的问题

  1. 避免单点故障
  2. 可以抗并发量

存在的问题

  1. 存储数据上限
  2. 主库宕机,Redis无法写入新数据
2.哨兵机制

哨兵机制为了解决主从复制中的主库宕机无法写入新数据的问题,一旦主库宕机,会从从库中选举一个作为主库,通过更改从库的连接

解决问题

  • 解决主从复制中,主库意外宕机,无法写入新数据

存在的问题

  • 存储数据上限
3.去中心化集群

Redis-Cluster(去中心化集群):实现多主多从,可以解决并发量和数据存储问题

详述

  1. Redis集群是无中心的。
  2. Redis集群有一个ping-pang机制。
  3. 投票机制,Redis集群节点的数量必须是2n+ 1.
  4. Redis集群中默认分配了16384个hash槽,在存储数据时,就会将key进行crc16的算法,并且对16384取余,根据最终的结果,将key-value存放到指定Redis节点中,而且每一个Redis集群都在维护着相应的hash槽
  5. 为了保证数据的安全性,每一个集群的节点,至少要跟着一个从节点。
  6. 单独的针对Redis集群中的某一个节点搭建主从。
  7. 当Redis集群中,超过半数的节点若机之后,Redis集群就瘫痪了。

过期策略

Redis为key设置有效期,Redis的过期策略用来解决有效期结束的key

  • 定期删除:Redis会在100ms的间隔中定时,查看并随机删除指定数量的key
  • 惰性删除:每次查询时,先判定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(默认)在内存不⾜时,直接报错
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值