Redis

Redis 命令

Redis 命令

set命令 get命令
然后就是选择redis的库用到了select 0-15总共16个库

Redis数据结构介绍

基本类型:String Hash List Set SortedSet
特殊类型:GEO(地理坐标) BitMap HyperMap(字符串)

Redis的通用命令

  • KEYS 查询符合模板的所有KEY 不建议在生产环境设备上使用 因为redis是单线程的 然后这个查询可能耗费时间比较长 所以在这段时间内会阻塞
  • DEL 删除指定的KEY
  • EXISTS 查看KEY是否存在
  • EXPIRE 给KEY设置一个有效期 有效期到期 KEY就会自动删除
  • TTL 查看一个KEY的剩余有效期 -2代表不存在了 -1代表永久有效

String类型

是redis中最简单的数据类型 字符串类型最大空间不能超过512M

  • SET 添加或者修改已经存在的一个String类型的键值对
  • GET 根据KEY获取String类型的value
  • MSET 批量添加多个String类型的键值对
  • MGET 批量根据多个key得到value
  • INCR 让一个整型的key自增1
  • INCRBY 让一个整型的key自增并指定步长 例如 incrby num 2 让num自增2
  • INCRBYFLOAT 让一个浮点型的数字自增并指定步长
  • SETNX 添加一个String类型的键值对 前提是这个key不存在 否则不执行
  • SETEX 添加一个String类型的键值对 并且指定有效期

KEY的结构

Redis中的key允许有多个单词构成层级结构 多个单词之间用:隔开 比如项目名:业务名:类型:id
这个格式并非固定 如果项目名叫itheima 然后一个业务是user 一个业务是product 那么两个同样的id就可以定义为itheima:user:1itheima:product:1从而达到相同的id因为层级关系的不同 存储结果不同

Hash

也叫散列 其value是一个无序字典 类似于Java中的HashMap结构 如果写成json字符串 会很难修改

  • 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
  • HVALS 获取一个hash类型的key中的所有的value
  • HKEYS 获取一个hash类型的key中的所有的field
  • HINCRBY 让一个hash类型的key自增并指定补偿
  • HSETNX 添加一个hash类型的key的值 如果这个field存在 则不执行

List

简介

redis中的list和Java中的linkedlist类似 是一个双向链表结构 既可以正向检索也可以支持反向检索
既然和linkedlist类似 那么特征如下

  • 有序
  • 元素可以重复
  • 插入删除较快
  • 查询速度一般

常用来存储一个有序列表 比如朋友圈点赞列表 评论列表等

list常见命令

  • LPUSH key element... 向列表左侧插入一个或多个元素

  • LPOP key 移除并返回列表左侧的第一个元素 没有则返回nil

  • RPUSH key element... 向列表右侧插入一个或多个元素

  • RPOP key 移除并返回列表右侧的第一个元素

  • LRANGE key star end 返回一段角标范围内的所有元素

  • BLPOP和BRPOP 和LPOP和RPOP类似 只不过在没有元素时等待指定时间 而不是直接返回nil

    用list模拟一个栈
    入口和出口在同一边 也就是LPOP和LPUSH
    用list模拟一个队列
    入口和出口在不同边 也就是LPUSH和RPOP或者反过来
    用list模拟一个阻塞队列
    首先保证是队列 入口出口在不同边 然后用BLPUSH和BRPOP 等待获取

Set

简介

redis中的set结构和java中的HashSet类似 可以看成是value为null的HashMap
特征如下

  • 无序
  • 元素不可重复
  • 查找快
  • 支持交集并集差集等功能

常见命令

  • SADD key member... 向set中添加一个或多个元素
  • SREM key member... 移除set中的指定元素
  • SCARD key 返回set中元素的个数
  • SISMENBER key member... 判断一个元素是否存在于set中
  • SMEMBERS 获取set中的所有元素
  • SINTER key1 key2... 求key1和key2的交集
  • SDIFF key1 key2... 求key1-key2的集合
  • SUNION key1 key2... 求key1和key2的并集

SortedSet

简介

redis中的SortedSet同样也是set 但是可排序 类似于java中的TreeSet 但是底层实现是不一样的 SortedSet中的每个元素都有score属性 然后就可以根据这个score来排序 底层实现是一个调表(SkipList)加上hash表
特性

  • 可排序
  • 元素不重复
  • 查询速度快

常见命令

  • ZADD key score member... 添加一个或者多个元素到SortedSet中 如果已经存在则更新score值
  • ZREM key member 移除SortedSet中的指定元素
  • ZSCORE key member 得到SortedSet中指定元素的score值
  • ZRANK key member 获取SortedSet中的指定的元素排名
  • ZCARD key 获取SortedSet的个数
  • ZCOUNT key min max 统计分数在指定范围内的所有元素个数
  • ZINCRBY key increment member 让SortedSet中指定元素按照步长去自增
  • ZRANGE key min max 按照score排序后获取指定排名范围内的元素
  • ZRANGEBYSCORE key min max 按照score排序后 获取指定score范围内的元素
  • ZDIFF ZINTER ZUNION 求差集 交集 并集

排序都是升序排名 如果要降序排名 在排序的命令Z后面加上REV即可

redis的java客户端

客户端对比

jedis客户端

使用jedis

  • 引入依赖
       <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>6.0.0</version>
        </dependency>
  • 建立连接
    @BeforeEach
    void setUp() {
        // 建立链接
        jedis = new Jedis("192.168.88.130",6379);
        jedis.auth("123456");
        jedis.select(0);
    }

建立完连接之后就可以开始测试了 jedis客户端中的命令是跟redis是一样的 所以不需要其他的api 直接使用jedis.redis命令即可
还需要做的就是关闭连接 @AfterEach void tearDown() { if(jedis != null) { jedis.close(); } }

jedis连接池

其实就是建一个工厂类 定义静态常量对象 然后通过静态块来配置 最后通过一个静态方法得到Jedis连接

然后建立连接直接通过Jedis jedis = JedisConnectionFactory得到即可

SpringDataRedis

介绍

SpringData是spring中数据操作的模块 对各种数据库的集成 其中对redis的集成模块叫做SpringDataRedis
该特点为

  • 提供了对不同redis客户端的整合(lettuce和jedis)
  • 提供了RedisTemplete来统一API操作Redis
  • 支持Redis的发布订阅模型
  • 支持Redis哨兵和Redis集群
  • 支持基于lettuce的响应式编程
  • 支持基于JDK JSON 字符串 spring对象的数据序列化及反序列化
  • 支持基于Redis的JDKCollection的实现 就是对栈 队列 数组集合的又一次实现 方便统筹数据

RedisTemplate

该工具类根据命令类型的不同封装到了不同的操作中
具体如下

RedisTemplate快速入门

  • 引入依赖 一个是redis 的依赖 一个是连接池的依赖
<!--        redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

<!--        commons-pool-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.12.1</version>
        </dependency>
  • 配置连接
    需要在properties中配置连接池的各种参数
spring.application.name=demo
spring.data.redis.host=192.168.88.130
spring.data.redis.port=6379
spring.data.redis.password=123456
spring.data.redis.lettuce.pool.max-active=8
spring.data.redis.lettuce.pool.max-idle=8
spring.data.redis.lettuce.pool.min-idle=0
spring.data.redis.lettuce.pool.max-wait=1000ms
  • 后续就可以直接注入RedisTemplate然后使用

RedisTemplate的序列化反序列化

由于RedisTemplate接受的是object数组类型的 所以虽然存储的String字符串 但是会被redis当成java对象 然后处理java对象就是用序列化工具进行序列化 默认采用jdk序列化
进行序列化之后就会变成如下

缺点

  • 可读性差
  • 内存占用较大

解决该问题就可以RedisTemplate的Key和Value的序列化器
Key使用String序列化器
Value就可以使用json序列化器 因为value有可能是对象
实现就是建一个config对象 然后将RedisTemplate作为Bean注入到容器中

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        //创建对象
        RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
        //设置连接工厂
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //创建json序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        //设置key的序列化
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        //设置value的序列化
        redisTemplate.setValueSerializer(jsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jsonRedisSerializer);
        //返回
        return  redisTemplate;
    }
}

后续再使用就可以在图形化界面中正常显示 因为使用了序列化

StringRedisTemplate

使用json序列化器来处理value 会使对象在存储的时候带上自己所属的类的全类名 转为字节码进行存储 当数据量过大 就会耗过多内存
因此为了节省内存空间 不会使用json序列化器来处理value 然后都用String存储 存的时候以json字符串来存 取的时候拿到的也是json字符串 再另外进行json字符串转为java对象的工作即可
spring默认提供了一个模板类叫做StringTemplate 这个模板类默认使用的序列化器就是String类型的

  • 存数据
    先new对象 然后存数据的时候将对象转化为json字符串进行存储
private static final ObjectMapper mapper = new ObjectMapper();

        User user = new User("呵呵",16);
        String json = mapper.writeValueAsString(user);
        stringRedisTemplate.opsForValue().set("user:100",json);
  • 读数据
    存入到redis根据key读出的时候也是json字符串 所以需要手动的将该json字符串反序列化为对象
        String jsonUser = stringRedisTemplate.opsForValue().get("user:100");
        User user1 = mapper.readValue(jsonUser, User.class);
        System.out.println("user1 = " + user1);

然后就实现了节省内存的操作

posted @ 2025-07-14 21:02  big4mart  阅读(4)  评论(0)    收藏  举报