springboot使用redis和redis在Spring Boot对应方法

375 阅读5分钟

springboot使用redis步骤

1.添加依赖

image.png redis起步依赖,导入后可以直接使用RedisTemplate

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

2.在application.properties中配置redis连接

指定redis信息 (如 host, ip, password) spring.redis.host=localhost spring.redis.port=6379

没有密码可以不用配置这个 #spring.redis.password=123456

3.使用redisTemplate来访问redis服务器

@RestController
public class RedisController {

    /**
     * 需要注入redis模板
     *
     * 对于RedisTemplate的泛型情况,
     * 可以使用<String, String>
     *       <Object, Object>
     *       或者不写泛型
     *
     *  注意,属性的名称必须为redisTemplate,因为按名称注入,框架创建的对象就是这个名字的
     */
    @Resource
    private RedisTemplate redisTemplate;

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    // 添加数据到redis
    @PostMapping("/redis/addstring")
    public String addToRedis(String name, String value) {

        // 操作Redis中的string类型的数据,先获取ValueOperation
        ValueOperations valueOperations = redisTemplate.opsForValue();

        // 添加数据到redis
        valueOperations.set(name, value);
        return "向redis添加string类型的数据";
    }

    // 从redis获取数据
    @GetMapping("/redis/getk")
    public String getData(String key) {

        ValueOperations valueOperations = redisTemplate.opsForValue();
        Object v = valueOperations.get(key);
        return "key是" + key + ",它的值是:" + v;
    }

    @PostMapping("/redis/{k}/{v}")
    public String addStringKV(@PathVariable String k,
                              @PathVariable String v) {

        // 使用StringRedisTemplate对象
        stringRedisTemplate.opsForValue().set(k,v);
        return "使用StringRedisTemplate对象添加";
    }

    @GetMapping("/redis/{k}")
    public String getStringValue(@PathVariable String k) {

        // 获取String类型的value
        String v = stringRedisTemplate.opsForValue().get(k);
        return "从redis中通过" + k + "获取到string类型的v=" + v;
    }
}

redisTemplate对象有好几种,上面代码中给了两种
一种为RedisTemplate,这种是有泛型的,泛型类型为<String, String> 或者 <Object, Object> 或者不添加泛型,当用它来向redis服务器中存入String类型的数据时,会出现乱码. 当我们使用StringRedisTemplate对象存取String类型的数据时,是没有乱码的

StringRedisTemplate和RedisTemplate

上面说到了这两者在存取中的差异

  • StringRedisTemplate : 这个类将key和value都做String处理,使用的是String的序列化,可读性好
  • RedisTemplate : 把key和value经过了序列化,key和value都是序列化的内容,不能直接识别,默认使用的是JDK的序列化,可以修改为其他的序列化

序列化作用 :
序列化是将对象转换为可传输字节序列的过程,反序列化是将字节序列还原为原对象的过程.序列化最终的目的是为了对象可以跨平台存储和进行网络的传输

序列化的方式 :
序列化只是一种拆装对象的规则,那么这种规则也就多种多样,常见的有JDK(不支持跨语言),json,xml,Hessian等
我们上面的RedisTemplate类的存储就是JDK方式的

jdk方式的序列化
jdk序列化
java的序列化 :  把java对象转换为byte[],二进制数据
json序列化 :  json序列化功能将对象转换为json格式或者将其转换回对象,如Student对象转换为{“name”:“张三”,“age”:“20”}

Redis数据类型操作命令和Spring Boot对应方法

1.字符串类型(string)

字符串是Redis中最为基本的数据类型之一,也是能够储存任何格式的值,如 png 图片或 JSON 数据等等。

常用命令

  • 设置指定 key 的值
    set key value

    public void set(String key, Object value) {
            redisTemplate.opsForValue().set(key, value);
       }
    
    123
    
  • 获取指定 key 的值

    get key

    public Object get(String key) {
            return redisTemplate.opsForValue().get(key);
        }
    
    123
    
  • 批量获取指定 key 的值

    mget key1 [key2..]

      public List<Object> strlen(String... key) {
          	 List<Object> result = redisTemplate.opsForValue().multiGet(Arrays.asList(key,key2));
           	 return result;
        }
    
    
    12345
    
  • 删除指定 key 的值

    del key

    public void del(String... key) {
            if (key != null && key.length > 0) {
                if (key.length == 1) {
                    redisTemplate.delete(key[0]);
                } else {
                    // 批量删除
                    redisTemplate.delete((Collection<String>) CollectionUtils.arrayToList(key));
                }
            }
        }
    
    12345678910
    
  • 返回指定键的字符串长度

    strlen key

    public Long strlen(String key) {
            return redisTemplate.opsForValue().size(key);
        }
    
    123
    
  • 将键存储的数字减一

    decr key

    public Long decr(String key) {
            return redisTemplate.opsForValue().decrement(key);
        }
    
    123
    
  • 将键存储的数字加一

    incr key

    public Long incr(String key) {
            return redisTemplate.opsForValue().increment(key);
        }
    
    123
    

2. 列表类型(list)

列表 (list) 是强大的工具,它可以允许你执行范围访问并且(从两端)添加和弹出元素。

常用命令:

  • 从队列左边入队一个元素

    lpush key element

    public void lpush(String key, Object value) {
        redisTemplate.opsForList().leftPush(key, value);
    }
    
    123
    
  • 从队列右边入队一个元素

    rpush key element

    public void rpush(String key, Object value) {
        redisTemplate.opsForList().rightPush(key, value);
    }
    
    123
    
  • 从队列左边弹出/删除一个元素

    lpop key

    public Object lpop(String key) {
        return redisTemplate.opsForList().leftPop(key);
    }
    
    123
    
  • 从队列右边弹出/删除一个元素
    rpop key

    public Object rpop(String key) {
        return redisTemplate.opsForList().rightPop(key);
    }
    
    123
    
  • 获取指定范围内的所有元素, start 和 end 都是从0开始的索引值
    lrange key start end

    public List<Object> lrange(String key, int start, int stop) {
        return redisTemplate.opsForList().range(key, start, stop);
    }
    
    123
    
  • 获取指定 key 中的元素个数
    llen key

    public long llen(String key) {
        return redisTemplate.opsForList().size(key);
    }
    
    123
    

3.哈希类型(hash)

哈希表 (hash) 就像一个关联数组,其中字符串类型的字段和值之间存在映射关系。

常用命令:

  • 哈希表设置值
    hset key field value

    public void hset(String key, String field, Object value) {
        redisTemplate.opsForHash().put(key, field, value);
    }
    
    
  • 获取哈希表中指定字段的值
    hget key field

    public Object hget(String key, String field) {
        return redisTemplate.opsForHash().get(key, field);
    }
    
    
  • 获取哈希表所有的字段和值
    hgetall key

    public Map<Object, Object> hgetAll(String key) {
        return redisTemplate.opsForHash().entries(key);
    }
    
    
  • 删除哈希表指定字段的值
    hdel key field

    public void hdel(String key, String... fields) {
        redisTemplate.opsForHash().delete(key, (Object) fields);
    }
    
    
    
  • ​ 获取多个field的值

    hmget key field1 [field2..]

    public List<Object> multiHget(String key, List<Object> fields) {
        return redisTemplate.opsForHash().multiGet(key, fields);
    }
    
    
    

4.集合类型(set)

SET 类型是一组无序的字符串结构。这组非重复的字符串称作成员(member)。

常用命令:

  • set添加元素
    sadd key member

    public long sadd(String key, Object... values) {
        return redisTemplate.opsForSet().add(key, values);
    }
    
    
  • 查询集合中的所有元素
    smembers key

    public Set<Object> smembers(String key) {
        return redisTemplate.opsForSet().members(key);
    }
    
    
  • 返回集合中的元素个数
    scard key

    public long scard(String key) {
        return redisTemplate.opsForSet().size(key);
    }
    
    
  • 删除集合中指定元素
    srem key member

     public long srem (String key, Object... values) {
            try {
                Long count = redisTemplate.opsForSet().remove(key, values);
                return count;
            } catch (Exception e) {
                e.printStackTrace();
                return 0;
            }
        }