Redis

本文最后更新于 2025年7月13日 早上

Redis学习记录

Sql与Nosql区别

Redis简介

安装redis

  • 如何看redis是否已经运行
    • ps -ef | grep redis

Redis的value类型



  • 帮助:在redis-cli中输:help @ 然后按tab键进行切换

常用命令


  • 过期时间中 -1是永久存在,-2是已经到期

String类型


  • 常见命令
    • incrbyfloat没有默认增长,后面必须要加增长多少,没有默认增长
    • setNx是新增不存在的
      • set name zhangsan nxsetNx name zhangsan效果是一样的
    • setEx
      • setex name 10 Jackset name Jack ex 19效果是一样的
    • DEL 删除,并且可以批量删除

Key的结构


Hash类型


  • HMset:set的时候可以把键放在前面,然后面直接就是多个kv kv kv
  • HMget:get的时候可以把所有的键写下来,k k k k
  • HgetALL:直接写顶级的,一级key,就能把所有的子集数据展示出来
  • HsetNx:是判断field存不存在,不是顶级key了

List类型


  • BLPOP中的B是block,阻塞的意思
  • BLPOP的语法是 BLPOP [key] [timeout],就是如果找不到就一直阻塞在那边,如果在阻塞的同时添加一个键进去,那边阻塞立马就会结束并且返回键中的最L值,同理BRPOP也是如此

Set类型


SortedSet类型


  • 默认升序,ZRank是升序,ZREVRank是降序,加REV是直接在Z后面加的,REV指的是reverse(反转)
  • zcount是针对分数score的,zrange是针对排名的范围,count是查数量,range是查元素,查人名的

Redis的Java客户端


  • Redis的Java客户端

Jedis


  • jedis中方法名和redis是一致的
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    public class JedisTest {  
    private Jedis jedis;


    @BeforeEach
    void setup(){
    //连接
    jedis = new Jedis("ip",6379);
    //密码
    jedis.auth("redis");
    //选择库
    jedis.select(1);
    }

    @Test
    void testString(){
    // 存
    String set = jedis.set("name", "Odyssey");
    System.out.println("set = "+set);
    // 取
    String name = jedis.get("name");
    System.out.println("name = "+name);
    }

    @Test
    void testHash(){
    jedis.hset("user:1", "name", "Odyssey");
    String name = jedis.hget("user:1", "name");
    System.out.println("name = "+name);
    HashMap<String, String> map = new HashMap<>();
    map.put("name", "Odyssey");
    map.put("age", "18");
    map.put("sex", "男");
    map.put("address", "中国");
    String hmset = jedis.hmset("user:1", map);
    System.out.println("hmset = "+hmset);
    Map<String, String> stringStringMap = jedis.hgetAll("user:1");
    System.out.println("stringStringMap = "+stringStringMap);
    String age = jedis.hget("user:1", "age");
    System.out.println("age = "+age);
    }

    @AfterEach
    void close(){
    if(jedis!=null){
    jedis.close();
    }
    }
    }

Jedis连接池


  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public class JedisConnectionFactory {  
    private static final JedisPool jedisPool;

    /*
    执行机制:静态代码块会在类被加载的时候自动执行,
    而且仅执行一次,这确保了连接池会在应用启动时就完成初始化
    */ static {
    //配置连接池
    JedisPoolConfig poolConfig = new JedisPoolConfig();
    //最大连接数
    poolConfig.setMaxTotal(8);
    //最大空闲连接数
    poolConfig.setMaxIdle(8);
    // 最小空闲连接数
    poolConfig.setMinIdle(0);
    // 获取连接时的最大等待毫秒
    poolConfig.setMaxWaitMillis(1000);
    // 创建连接池对象
    jedisPool = new JedisPool(poolConfig, "ip/hostname", 6379, 1000, "pwd");
    }

    public static Jedis getJedis() {
    return jedisPool.getResource();
    }
    }

SpringDataRedis



  • 快速入门
  1. 引入依赖(access+driver)
  2. 编写application.yml配置
  3. 注入RedisTemplate

SpringRedisData序列化方式


  • key和HashKey使用RedisSerializer

  • value的序列化一般采用GenericJackson2JsonRedisSerializer来序列化

  • 如果没有引入springmvc或者springweb依赖注意要加一个jackson-databind;

  • 为了节省内存空间,我们并不会使用JSON序列化器来处理value,而是统一使用String序列化器,要求只能存储String类型的key和value。当需要存储Java对象时,手动完成对象的序列化和反序列化。

StringRedisTemplate


  • ObjectMapper是用SpringMVC中自带的序列化工具,也可以用FastJSON
  • 现在保存到数据库之前要手动序列化,然后读取的时候要手动的反序列化
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    @Autowired  
    private StringRedisTemplate stringRedisTemplate;

    private static final ObjectMapper objectMapper = new ObjectMapper();

    @Test
    void testSaveUser() throws JsonProcessingException {
    // 写入
    // redisTemplate.opsForValue().set("user",new User("OdysseyChan",17));
    User u = new User("张三", 17);
    // 手动序列化
    String json = objectMapper.writeValueAsString(u);
    stringRedisTemplate.opsForValue().set("user:200",json);
    // 获取数据
    String jsonUser = stringRedisTemplate.opsForValue().get("user:200");
    // 手动反序列化
    User user = objectMapper.readValue(jsonUser, User.class);
    System.out.println("user = " + user);
    }
  • 整个测试类
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    @SpringBootTest  
    class RedisDemoApplicationTests {

    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Test
    void testRedisTemplate() {
    //写入
    redisTemplate.opsForValue().set("name", "OdysseyChan");
    //读取
    Object name = redisTemplate.opsForValue().get("name");
    System.out.println("name = " + name);
    }

    private static final ObjectMapper objectMapper = new ObjectMapper();

    @Test
    void testSaveUser() throws JsonProcessingException {
    // 写入
    // redisTemplate.opsForValue().set("user",new User("OdysseyChan",17));
    User u = new User("张三", 17);
    // 手动序列化
    String json = objectMapper.writeValueAsString(u);
    stringRedisTemplate.opsForValue().set("user:200", json);
    // 获取数据
    String jsonUser = stringRedisTemplate.opsForValue().get("user:200");
    // 手动反序列化
    User user = objectMapper.readValue(jsonUser, User.class);
    System.out.println("user = " + user);
    }

    @Test
    void testHash() {
    stringRedisTemplate.opsForHash().put("user:300", "name", "刘能");
    stringRedisTemplate.opsForHash().put("user:300", "age", "18");

    Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries("user:300");
    System.out.println("entries = " + entries);
    }
    }

总结


目前Redis这里先是从redis的基础语法包括String 、Hash、List、Set、SortedSet,学习了解如何存取并且设置存活时间,接着学习在Java项目中使用jedis和lettuce进行操作存取,然后学习了使用jedis连接池来获取jedis对象,最后使用SpringDataRedis来进行操作redis,其中包括为避免序列中存储的额外开销而使用StringRedisTemplate


Redis
http://yething.github.io/posts/3135569683.html
作者
Odyssey
发布于
2025年7月12日
许可协议