ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

【redis笔记】

2026/9/15 7:27:19 拓冰建站 浏览量
【redis笔记】

Redis简介

安装步骤

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:

字符串string

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

哈希hash 适合存储对象

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

列表list 按照插入顺序排序,可以有重复元素

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

集合set 无序集合,没有重复元素

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有序集合sorted set 有序集合,没有重复元素

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Redis常用通用命令,任何类型都可以使用

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

keys * :查看所有的key

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ttl name:如果返回-1,说明存活时间是永久的

在java种操作redis

使用客户端Jedis

jedis的maven坐标

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.8.0</version>
</dependency>

使用jedis操作redis的步骤:

①获取链接

②执行操作

③关闭链接

import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;import java.util.Set;public class TestRedis {@Testpublic void test01(){
//        1获取链接Jedis jedis = new Jedis("localhost", 6379);//        2执行具体的操作jedis.set("username","xiaoming");String username = jedis.get("username");System.out.println(username);jedis.del(username);String s = jedis.get(username);System.out.println(s);jedis.hset("hset1","value","1");String hget = jedis.hget("hset1", "value");System.out.println(hget);Set<String> keys = jedis.keys("*");for(String key:keys){System.out.println(key);}
//        3关闭连接jedis.close();}
}

在Java种操作redis进阶

使用spring data redis

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

redis相关配置
spring:application:#应用的名称,可选name: reggie_take_outredis:host: localhostprot: 6379#password: 123456#默认是0号数据库 换数据库命令  select 1 进入1号数据库#最多有16个数据库database: 0jedis:
#      redis连接池配置pool:max-active: 8max-wait: 1msmax-idle: 4min-idle: 0

导入依赖包

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

改变序列化方式

提供配置类

package com.xue.reggie.config;import org.springframework.cache.annotation.CachingConfigurerSupport;
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;@Configuration
public class RedisConfig extends CachingConfigurerSupport {public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory connectionFactory){RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();//        默认的key序列化器为:JdkSerializationRedisSerializerredisTemplate.setKeySerializer(new StringRedisSerializer());
//        把hash的field的序列化也改成stringredisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setConnectionFactory(connectionFactory);return redisTemplate;}
}

使用

import com.xue.reggie.ReggieApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.*;
import org.springframework.test.context.junit4.SpringRunner;
import redis.clients.jedis.Jedis;import javax.annotation.Resource;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;@SpringBootTest(classes = ReggieApplication.class)
//测试启动器
@RunWith(SpringRunner.class)
public class TestRedis {@Resourceprivate RedisTemplate redisTemplate;@Testpublic void test01(){
//        1获取链接Jedis jedis = new Jedis("localhost", 6379);//        2执行具体的操作jedis.set("username","xiaoming");String username = jedis.get("username");System.out.println(username);jedis.del(username);String s = jedis.get(username);System.out.println(s);jedis.hset("hset1","value","1");String hget = jedis.hget("hset1", "value");System.out.println(hget);Set<String> keys = jedis.keys("*");for(String key:keys){System.out.println(key);}
//        3关闭连接jedis.close();}/*** 操作普通string*/@Testpublic void test02(){
//        普通ValueOperations valueOperations = redisTemplate.opsForValue();//        set 无序不重复SetOperations setOperations = redisTemplate.opsForSet();
//        有序 可重复ListOperations listOperations = redisTemplate.opsForList();
//        有序 不可重复ZSetOperations zSetOperations = redisTemplate.opsForZSet();valueOperations.set("city","beijing");String city = (String)valueOperations.get("city");//        设置只存在10秒钟valueOperations.set("k1","value1",10l, TimeUnit.SECONDS);System.out.println(city);Boolean b = valueOperations.setIfAbsent("city", "1234");System.out.println(b);
//        此时输出false,证明redis里面已经有“city”这个key了,虽然值不一样把}/*** 操作hash*/@Testpublic void test03(){//        哈希 key-feild-value
//        存值HashOperations hashOperations = redisTemplate.opsForHash();hashOperations.put("key1","hashkey1","value1");hashOperations.put("key1","hashkey2","value2");//        取值String o = (String) hashOperations.get("key1", "hashkey1");System.out.println(o);//        获得hash结构种的所有字段Set keys = hashOperations.keys("key1");for (Object key : keys) {System.out.println(key);}
//        获得hash结构种的所有值  返回值是ListList values = hashOperations.values("key1");for (Object value : values) {System.out.println(value);}}/*** 操作list*/@Testpublic void test04(){ListOperations listOperations = redisTemplate.opsForList();listOperations.leftPushAll("mylist","a","b","v");//        取值List<String> mylist = listOperations.range("mylist", 0, -1);for (String o : mylist) {System.out.println(o);//v b a}Object o = listOperations.leftPop("mylist");System.out.println(o);//        获得列表长度lenLong mylist1 = listOperations.size("mylist");int llist = mylist1.intValue();for (int i = 0; i < llist; i++) {String mylist2 =(String) listOperations.rightPop("mylist");System.out.println(mylist2);}}/*** set类型的数据*/@Testpublic void test05(){SetOperations setOperations = redisTemplate.opsForSet();setOperations.add("myset","a","b","c","a");
//        取值Set myset = setOperations.members("myset");for (Object o : myset) {System.out.println(o);}//        删除成员Long remove = setOperations.remove("myset", "a");System.out.println(remove);}/*** 操作zset*/@Testpublic void test06(){ZSetOperations zSetOperations = redisTemplate.opsForZSet();zSetOperations.add("myzset","a",10.0);zSetOperations.add("myzset","b",12.0);zSetOperations.add("myzset","a",11.0);Set<String> myzset = zSetOperations.range("myzset", 0, -1);for (String s : myzset) {System.out.println(s);}//        修改分数zSetOperations.incrementScore("myset","b",-5.0);zSetOperations.remove("myset","a");}/*** 通用操作*/@Testpublic void testCommon(){Set<String> keys = redisTemplate.keys("*");for (String key : keys) {System.out.println(key);}
//判断是否存在Boolean myset = redisTemplate.hasKey("myset");
//        删除指定的keyredisTemplate.delete("myset");
//        获取指定key对应的value的数据类型DataType myset1 = redisTemplate.type("myset");System.out.println(myset1);}
}
使用redis
1、RedisTemplate和StringRedisTemplate的区别

区别在于StringRedisTemplate只操作字符串,而RedisTemplate操作对象

  1. 两者的关系是StringRedisTemplate继承RedisTemplate。

  2. 两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。

  3. SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。

StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。

RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

RedisTemplate默认使用的序列类在在操作数据的时候,比如说存入数据会将数据先序列化成字节数组然后在存入Redis数据库,这个时候打开Redis查看的时候,你会看到你的数据不是以可读的形式展现的,而是以字节数组显示,类似下面

img

当然从Redis获取数据的时候也会默认将数据当做字节数组转化,这都是根据序列化策略来决定的。

而stringredistemplate,默认存入的数据就是原文,因为stringRedistemplate默认使用的是string序列化策略,使用stringredistemplate默认存入数据长这个样:

img

2、setKeySerializer和setHashKeySerializer
  • setEnableDefaultSerializer(false);

    关闭redis默认序列化器

  • setKeySerializer();

    设置string字符串的key的序列化器

  • setValueSerializer();

    设置string字符串的value的序列化器

  • setStringSerializer();

    设置String的序列化器

  • setHashKeySerializer();

    设置hash的value的序列化器

  • setHashValueSerializer();

    设置hash的value的序列化器