Redis 相关操作

背景

晚上学习了下redis,有很多特定语法,特地记录

redis官网地址:www.redis.net.cn

分类

redis存储的是key,value格式的数据,其中key都是字符串,value有5种不同的数据结构

字符串类型

String

存储:set key value

获取: get key

删除: del key

存储并设置过期时间:setex key seconds value

key不存在时才能存储: setnx key value

ruby 复制代码
# 设置张三姓名
127.0.0.1:6379> set name zhangsan 
OK 
ruby 复制代码
# 获取名字
127.0.0.1:6379> get name
"zhangsan" 
ruby 复制代码
# 删除名字
127.0.0.1:6379> del name 
(integer) 1 

# 删除成功
127.0.0.1:6379> get name
(nil)

哈希类型

hash : map格式

存储 :hset key field value

获取: hget key field

获取所有的 key 和 value:hgetall key

删除: hdel key field

获取哈希表中所有字段: hkeys key

获取哈希表所有值: hvals key

ruby 复制代码
# 在 myhash 组中设置性别为男
127.0.0.1:6379> hset myhash sex nan 
(integer) 1 
ruby 复制代码
# 在 myhash 组中设置名字为tom
127.0.0.1:6379> hset myhash name tom
(integer) 1

# 在 myhash 组中修改性别为男=女
127.0.0.1:6379> hset myhash sex nv
(integer) 0
ruby 复制代码
# 性别修改成功
127.0.0.1:6379> hget myhash sex
"nv"
ruby 复制代码
# 在myhash组中获取姓名
127.0.0.1:6379> hget myhash name
"tom"
ruby 复制代码
# 获取myhash组中的键值对
127.0.0.1:6379> hgetall myhash
1) "sex" 
2) "nv" 
3) "name" 
4) "tom"

列表类型

list : linkedlist格式,支持重复元素,可以添加一个元素到列表的头部或者尾部

添加:

从列表左边加入:lpush key value1 [value2]

右边:rpush key value

获取:lrange key start end:范围获取

删除:lpop key:删除列表最左边的元素,并将元素返回

rpop key: 删除列表最右边的元素,并将元素返回

获取列表长度: llen key

ruby 复制代码
# 在mylist列表中,左侧添加a ----> a
127.0.0.1:6379> lpush mylist a 
(integer) 1 

# 在mylist列表中,左侧添加b ----> b a
127.0.0.1:6379> lpush mylist b 
(integer) 2 

# 在mylist列表中,右侧添加c ----> b a c
127.0.0.1:6379> rpush mylist c 
(integer) 3 

# 在mylist列表中,右侧添加d ----> b a c d
127.0.0.1:6379> rpush mylist d 
(integer) 4 

# 显示mylist列表中所有内容
127.0.0.1:6379> lrange mylist 0 -1 
1) "b" 
2) "a" 
3) "c" 
4) "d" 

127.0.0.1:6379> lpop mylist 
"b" 

127.0.0.1:6379> rpop mylist 
"d" 

集合类型

set : 不允许重复元素

存储:sadd key value

获取:smembers key:获取set集合中所有元素

删除:srem key value:删除set集合中的某个元素

获取成员数: scard key

返回所有集合的交集: sinter key1 [key2]

返回所有集合的并集: sunion key1 [key2]

删除集合中的一个或者多个成员: srem key menber1 [menber2]

ruby 复制代码
# 在myset集合中,添加b
127.0.0.1:6379> sadd myset b 
(integer) 1 

# 在myset集合中,添加c
127.0.0.1:6379> sadd myset c 
(integer) 1 

# 在myset集合中,添加a
127.0.0.1:6379> sadd myset a 
(integer) 1 

 # 在myset集合中,再次添加b
127.0.0.1:6379> sadd myset b 
(integer) 0

# 显示myset集合内容
127.0.0.1:6379> SMEMBERS myset 
1) "b" 
2) "c" 
3) "a" 

 # 在myset集合中,删除内容b
127.0.0.1:6379> srem myset b 
(integer) 1 

# 显示myset集合内容
127.0.0.1:6379> SMEMBERS myset 
1) "c" 
2) "a"

有序集合类型

sorterdset :不允许重复元素,且元素有顺序

存储:zadd score key value

获取:zrange key start end

删除:zren key value

指定对象加上增量inc : zincrby key increment menber

ruby 复制代码
# 在mysort集合中,添加键值对(66,xy)
127.0.0.1:6379> zadd mysort 66 xy 
(integer) 1 

# 在mysort集合中,添加键值对(88,xxxy)
127.0.0.1:6379> zadd mysort 88 xxxy 
(integer) 1 

# 按照key从递增的顺序,依次mysort集合对应的value
127.0.0.1:6379> zrange mysort 0 -1 
1) "xy" 
2) "xxxy" 

# 同时显示key和value
127.0.0.1:6379> zrange mysort 0 -1 withscores 
1) "xy"
2) "66" 
3) "xxxy" 
4) "88"

通用指令

keys * :查询所有的键

exist key: 检查给定key是否存在

type key:获取键对应的value的类型

del key:删除指定的key value

springboot 整合redis

导入依赖

xml 复制代码
<dependency> 
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId> 
</dependency>

配置 application.properities

ini 复制代码
#配置redis
spring.redis.host=127.0.0.1 
spring.redis.port=6379

测试

测试一:String 类操作

kotlin 复制代码
package com.example.demo;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisTemplate;

import javax.annotation.Resource;

@SpringBootTest
class DemoApplicationTests {

    @Resource
    private RedisTemplate redisTemplate;

    @Test
    void contextLoads() {
        /*
        * 操作不同的数据类型
        * opsForValue 操作字符串 类似String
        * opsForList  操作List 类似List
        * opsForSet
        * opsForHash
        * opsForGeo
        * opsForZSet
        * opsForHyperLogLog
        * */

      
        //除了基本的操作,常用的方法都可以直接通过redisTemplate操作
       /* RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
        connection.flushDb();
        connection.flushAll();*/
        redisTemplate.opsForValue().set("name","xy");
        Object name = redisTemplate.opsForValue().get("name");
        System.out.println(name);
    }

}

测试二:序列化

ini 复制代码
package com.example.demo.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
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.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.net.UnknownHostException;

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);

        //json序列化配置
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer=new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om=new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

        //String的序列化
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

        template.setKeySerializer(stringRedisSerializer);
        template.setHashKeySerializer(stringRedisSerializer);
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
}

测试三:使用工具类

typescript 复制代码
package com.example.demo.utils;

import org.springframework.data.redis.core.*;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.Serializable;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * Redis 工具类
 */
@Service
public class RedisUtils {
    @Resource

    private RedisTemplate redisTemplate;

    private static double size = Math.pow(2, 32);

    /**
     * 写入缓存
     * @param key
     * @param offset
     * @param isShow
     * @return result
     */
    public boolean setBit(String key, long offset, boolean isShow) {
        boolean result = false;
        try {
            ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
            operations.setBit(key, offset, isShow);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 写入缓存
     * @param key
     * @param offset
     * @return result
     */
    public boolean getBit(String key, long offset) {
        boolean result = false;
        try {
            ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
            result = operations.getBit(key, offset);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 写入缓存
     * @param key
     * @param value
     * @return
     */
    public boolean set(final String key, Object value) {
        boolean result = false;
        try {
            ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
            operations.set(key, value);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 写入缓存设置时效时间
     * @param key
     * @param value
     * @return
     */
    public boolean set(final String key, Object value, Long expireTime) {
        boolean result = false;
        try {
            ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
            operations.set(key, value);
            redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 批量删除对应的value
     * @param keys
     */
    public void remove(final String... keys) {
        for (String key : keys) {
            remove(key);
        }
    }

    /**
     * 删除对应的value
     * @param key
     */
    public void remove(final String key) {
        if (exists(key)) {
            redisTemplate.delete(key);
        }
    }

    /**
     * 判断缓存中是否有对应的value
     * @param key
     * @return
     */
    public boolean exists(final String key) {
        return redisTemplate.hasKey(key);
    }

    /**
     * 读取缓存
     * @param key
     * @return
     */
    public Object get(final String key) {
        Object result = null;
        ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
        result = operations.get(key);
        return result;
    }

    /**
     * 哈希 添加
     * @param key
     * @param hashKey
     * @param value
     */
    public void hmSet(String key, Object hashKey, Object value) {
        HashOperations<String, Object, Object> hash = redisTemplate.opsForHash();
        hash.put(key, hashKey, value);
    }

    /**
     * 哈希获取数据
     * @param key
     * @param hashKey
     * @return
     */
    public Object hmGet(String key, Object hashKey) {
        HashOperations<String, Object, Object> hash = redisTemplate.opsForHash();
        return hash.get(key, hashKey);
    }

    /**
     * 列表添加
     * @param k
     * @param v
     */
    public void lPush(String k, Object v) {
        ListOperations<String, Object> list = redisTemplate.opsForList();
        list.rightPush(k, v);
    }

    /**
     * 列表获取
     * @param k
     * @param l
     * @param l1
     * @return
     */
    public List<Object> lRange(String k, long l, long l1) {
        ListOperations<String, Object> list = redisTemplate.opsForList();
        return list.range(k, l, l1);
    }

    /**
     * 集合添加
     * @param key
     * @param value
     */
    public void add(String key, Object value) {
        SetOperations<String, Object> set = redisTemplate.opsForSet();
        set.add(key, value);
    }

    /**
     * 集合获取
     * @param key
     * @return
     */
    public Set<Object> setMembers(String key) {
        SetOperations<String, Object> set = redisTemplate.opsForSet();
        return set.members(key);
    }

    /**
     * 有序集合添加
     * @param key
     * @param value
     * @param scoure
     */
    public void zAdd(String key, Object value, double scoure) {
        ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
        zset.add(key, value, scoure);
    }

    /**
     * 有序集合获取
     * @param key
     * @param scoure
     * @param scoure1
     * @return
     */
    public Set<Object> rangeByScore(String key, double scoure, double scoure1) {
        ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
        redisTemplate.opsForValue();
        return zset.rangeByScore(key, scoure, scoure1);
    }


    /**
     * 第一次加载的时候将数据加载到 redis 中
     * @param name
     */
    public void saveDataToRedis(String name) {
        double index = Math.abs(name.hashCode() % size);
        long indexLong = new Double(index).longValue();
        boolean availableUsers = setBit("availableUsers", indexLong, true);
    }

    /**
     * 第一次加载的时候将数据加载到redis中
     * @param name
     * @return
     */
    public boolean getDataToRedis(String name) {
        double index = Math.abs(name.hashCode() % size);
        long indexLong = new Double(index).longValue();
        return getBit("availableUsers", indexLong);
    }

    /**
     * 有序集合获取排名
     * @param key   集合名称
     * @param value 值
     */
    public Long zRank(String key, Object value) {
        ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
        return zset.rank(key, value);
    }


    /**
     * 有序集合获取排名
     * @param key
     */
    public Set<ZSetOperations.TypedTuple<Object>> zRankWithScore(String key, long start, long end) {
        ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
        Set<ZSetOperations.TypedTuple<Object>> ret = zset.rangeWithScores(key, start, end);
        return ret;
    }

    /**
     * 有序集合添加
     * @param key
     * @param value
     */
    public Double zSetScore(String key, Object value) {
        ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
        return zset.score(key, value);
    }


    /**
     * 有序集合添加分数
     * @param key
     * @param value
     * @param scoure
     */
    public void incrementScore(String key, Object value, double scoure) {
        ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
        zset.incrementScore(key, value, scoure);
    }


    /**
     * 有序集合获取排名
     * @param key
     */
    public Set<ZSetOperations.TypedTuple<Object>> reverseZRankWithScore(String key, long start, long end) {
        ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
        Set<ZSetOperations.TypedTuple<Object>> ret = zset.reverseRangeByScoreWithScores(key, start, end);
        return ret;
    }

    /**
     * 有序集合获取排名
     * @param key
     */
    public Set<ZSetOperations.TypedTuple<Object>> reverseZRankWithRank(String key, long start, long end) {
        ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
        Set<ZSetOperations.TypedTuple<Object>> ret = zset.reverseRangeWithScores(key, start, end);
        return ret;
    }
}
kotlin 复制代码
package com.example.demo;

import com.example.demo.pojo.User;
import com.example.demo.utils.RedisUtils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisTemplate;

import javax.annotation.Resource;

@SpringBootTest
class DemoApplicationTests {

    @Autowired
    private RedisUtils redisUtils;

    @Test
    void utils(){
        redisUtils.set("name","xy");
        System.out.println(redisUtils.get("name"));
    }
}
相关推荐
kong@react39 分钟前
使用springboot实现过滤敏感词功能
java·spring boot·后端·spring
丘山子1 小时前
一些 Python 字典(dict)的常见使用误区
后端·python·面试
31535669132 小时前
我开源了一套springboot3快速开发模板
后端·github
我崽不熬夜2 小时前
为什么Java中的设计模式会让你的代码更优雅?
java·后端·设计模式
先做个垃圾出来………3 小时前
简单的 Flask 后端应用
后端·python·flask
音元系统3 小时前
项目开发中途遇到困难的解决方案
后端·目标跟踪·中间件·服务发现
丘山子3 小时前
判断 Python 代码是否由 LLM 生成的几个小技巧
后端·python·面试
LaoZhangAI3 小时前
2025全面评测:Flux AI图像生成器6大模型全解析【专业测评】
前端·后端
豌豆花下猫3 小时前
Python 潮流周刊#107:无 GIL Python 被正式批准(摘要)
后端·python·ai
发愤图强的羔羊3 小时前
SpringBoot + Beetl 实现动态数据库DDL
后端