Redis的初步入门

Redis是一个基于内存key-value结构的数据库

  • 基于内存存储,读写性能高
  • 适合储存热点数据(热点商品、咨询、新闻 等)
    • 热点数据:短时间内大量用户进行访问
  • 企业应用广泛
  • 应用场景
    • 缓存
    • 任务队列
    • 消息队列
    • 分布式锁

Redis使用C语言开发,是一个开源的高姓名键值对数据库,可以达到100000+的QPS(每秒内的查询次数)

他的储存类型比较丰富,因此也叫做“结构化的NoSql数据库”

NoSql(Not Only SQL),不仅仅是SQL,泛指非关系型数据库,是关系型数据库的补充

Redis的设置

1、设置Redis在后台运行

将Redis配置文件中的daemonize属性值改为yes

2、初始化Redis的密码

在Redis配置文件中的,下图位置后

image-20231026092337483

加入:requirepass password

3、进入本地Redis

./redis-cli -h localhost -p 6379 -a password

4、开启Redis的远程连接

image-20231026094440085

Redis中的数据类型

Redis中存储的是key-value结构的数据

其中key是字符串,value的值有五种常用的数据类型

  • 字符串string
    • 最常用,存储普通字符串
  • 哈希hash
    • 适合存储对象
  • 列表list
    • 按照插入顺序排序
  • 集合set
    • 无序集合,没有重复元素
  • 有序集合sorted set
    • 有序集合,没有重复元素

Redis的常用命令

字符串string的操作命令

命令 含义
SET key value 设置指定key的值
GET key 获取指定key的值
SETEX key seconds value 设置指定key的值,并将key的过期时间设置为seconds秒
SETNX key seconds 只有在key不存在时设置key的值

哈希hash的操作命令

命令 说明
HSET key field value 将哈希表key中的字段field的值设置为value
HGET key field 获取存储在哈希表中指定字段的值
HDEL key field 删除存储在哈希表中指定的字段
HKEYS key 获取哈希表中所有的字段
HVALS key 获取哈希表中所有的值
HGETALL key 获取在哈希表中指定key的所有字段和值

列表list的操作命令

命令 说明
LPUSH key value1 [values] 将一个或多个值插入到列表的头部
LRANGE key start stop 获取列表指定范围内的元素
RPOP key 移除并获取列表最后一个元素
LLEN key 获取列表长度
BRPOP key1 [key2] timeout 移除并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时 或 发现可弹出元素为止

集合set的操作命令

命令 说明
SADD key member1 [member2] 向集合添加一个或多个成员
SMEMBERS key 返回集合中的所有成员
SCARD key 获取集合的成员数
SINTER key1 [key2] 返回给定所有集合的交集
SUNION key1 [key2] 返回所有给定集合的并集
SDIFF key1 [key2] 返回给定所有集合的差集
SREM key1 member1 [member2] 移除集合中一个或多个成员

有序集合sorted set的操作命令

命令 说明
ZADD key score1 memver1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间内的成员
ZINCRBY key increment member 有序集合中对指定成员分数加上增量increment
ZREM key member [member…] 移除有序集合中的一个或多个成员

通用命令

命令 说明
KEYS pattren 查找所有符合给定模式(pattern)的key
EXISTS key 检查给定key是否存在
TYPE key 返回key所储存的值的类型
TTL key 返回给定key的剩余生存时间(TTL, time to live), 以秒为单位
DDL key 在key存在时删除key

使用Java操作Redis数据库

Redis官方推荐的客户端:

  • Jedis
  • Lettuce
  • Redission

Spring对Redis客户端也进行了整合,提供了Spring Data Redis

Jedis操作Redis数据库

  • 获取连接
  • 执行操作
  • 关闭连接
Spring Data Redis

在spring中,提供了一个高度封装的类:RedisTemplate,针对Jedis客户端中的大量api进行归类封装,将同一类型操作封装为operation接口

  • ValueOperations:简单K-V操作
  • SetOperations:set类型数据操作
  • ZSetOperations:zset类型操作
  • HashOperations:针对map类型的数据操作
  • ListOperations:针对list类型的数据操作

注意:

  • 通过RedisTemplate对Redis进行操作的时候,Spring会对传入的数据进行序列化

  • 进而发生以下在redis官方客户端中,存入的格式不一样

image-20231026161537177

image-20231026161512085

  • 解决:通过自定义Redis配置类,更改序列化方式

    package com.solider.config;
    
    import org.springframework.cache.annotation.CachingConfigurerSupport;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.connection.RedisConnectionFactory;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.serializer.StringRedisSerializer;
    
    /**
     * @author Solider
     * @version 1.0
     * @Date 2023/10/26 16:17
     * @since 1.0
     */
    @Configuration
    public class RedisConfig extends CachingConfigurerSupport {
    
        @Bean
        public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
            RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
    
            // 默认的Key序列化器为:JdkSerializationRedisSerializer
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            redisTemplate.setHashKeySerializer(new StringRedisSerializer());
    
            redisTemplate.setConnectionFactory(redisConnectionFactory);
    
            return redisTemplate;
        }
    
    }