Redis基础操作-增删查改

前情提要:操作前提为在Vagrant中配置了dockers - redis,并将Vagrant的网卡配置转发到192.168.56.10,其中MySQL的端口为3306,redis的端口为6359
若想了解这方面知识,详情参考谷粒商城项目环境配置

demo结构:

配置文件:

spring.data.redis.host=192.168.56.10
spring.data.redis.port=6379
spring.data.redis.timeout=10s
spring.data.redis.database=0
spring.cache.redis.cache-null-values=true
spring.data.redis.jedis.pool.min-idle=0
spring.data.redis.jedis.pool.max-idle=8

RedisConfig:

@Configuration
public class RedisConfig {
    /**
     * @Param redisConnectionFactory redis连接工厂
     * @return
     */

    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){

        RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
        //设置Redis连接工厂
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        //设置key的序列化策略
        redisTemplate.setKeySerializer(new StringRedisSerializer());

        //设置value的序列化策列
        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));

        return redisTemplate;
    }
}

正文
在 RedisUtil.java 中 写相关的方法,然后在TestController.java中进行http请求进行调用

@Component
public class RedisUtil {

    @Resource
    RedisTemplate<String,Object> redisTemplate;

    /**
     * 设置Redis键值对
     * set key
     *
     * @param key Redis键
     * @param value Redis值
     *
     * opsForValue().set(key, value):设置指定 key 的值为指定的 value。
     *              添加数据 - 其实和更新数据语法是一样的
     */
    public boolean set(final String key,final Object value){
        ValueOperations<String,Object> operations = redisTemplate.opsForValue();
        operations.set(key, value);
        return true;
    }


    /**
     * 根据Redis键,自增1
     * incur key
     *
     * @param key Redis键
     * @return
     */
    public Long incur(final String key){
        ValueOperations<String,Object> operations = redisTemplate.opsForValue();
        return operations.increment(key);
    }

    /**
     * 根据key的值,查询value
     * 根据 key:**_phone 查询 value:也就是电话号码
     * 也就是分别对应 键+值
     * opsForValue().get(key):获取指定 key 的值。
     */
    public Object get(final String username){
        String key = username + "_phone";
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * 全数据查询-根据键设置 查询的是什么数据 如 *_phone 即为电话号码
     *
     */
    public String getAllPhone(){
        Set<String> keys = redisTemplate.keys("*_phone");
        for(String key : keys){
            Object value = redisTemplate.opsForValue().get(key);
            System.out.println("key: " + key + " value: " + value);

        }
        return "";
    }

    /**
     * 删除指定用户的电话号码数据
     * key - 用户名_phone
     */
    public boolean deletePhoneByName(String name){
        String t_name = name+"_phone";
        return redisTemplate.delete(t_name);
    }

    /**
     * 更新用户数据
     * 接收 name_phone 和 value
     * opsForValue().set(key, value):更新指定 key 的值为指定的 value。
     */
    public boolean updatePhone(final String key,final Object value){
        ValueOperations<String,Object> operations = redisTemplate.opsForValue();
        operations.set(key, value);
       return true;
    }
}

在本案例中,key值全部为 名字_phone 例如 张三_phone
incur方法为自增键,最初的想法是作为“阅读”量,每当有人访问时就自动+1

TestController.java:
 

@RestController
public class TestController {

    @Autowired
    private RedisUtil redisUtil;

    @PostMapping("/read")
    public String readArtical(){
        String key = "read_count";
        Long count = redisUtil.incur(key);
        return "阅读量增加到:" + count;
    }

    @PostMapping("/set_phone")
    public String setphone(@RequestParam("key")String key,@RequestParam("value")String value){
        String t_key = key + "_phone";
        redisUtil.set(t_key,value);
        return "已将 "+ key + " 的电话号码设置为 " + value;
    }

    @PostMapping("/get_phone")
    public String getphone(@RequestParam("username")String username){
        Object UserAndPhone = redisUtil.get(username);
        return "用户 " + username + "的手机号是 " + UserAndPhone;
    }

    @GetMapping("/getAllPhone")
    public void getAllPhone(){
        redisUtil.getAllPhone();
    }

    @PostMapping("/deletePhone")
    public String delPhone(@RequestParam("name")String name){
        Boolean res = redisUtil.deletePhoneByName(name);
        if(res) return "删除用户 "+ name +" 的电话成功";
        else return "删除失败";
    }

    @PostMapping("/updatePhone")
    public String updatePhone(@RequestParam("name")String name,@RequestParam("phone")String phone){
        String t_name = name + "_phone";
        redisUtil.updatePhone(t_name,phone);
        return "更新了 " + name + " 的电话号码为 " + phone;
    }

}

对Get、Post方法进行设置,并使用postman进行测试,注意发送的key要与@RequestParam中的需求名一致

测试样例:

其中 —— getAllPhone 在redis中并不常用,即查询库中所有数据,因为redis中数据以键值对的形式存在,库中可能会有很大数量的数据,如果查询全部数据,可能会导致系统崩溃等情况
其余方法则使用相关的Post、Get等并携带相应参数即可
要注意的是,使用postman进行测试,发送数据要选择 form-data 类型,key要与方法中@RequestParam所指定的名字一样

总结 —— 

RedisTemplate 是 Spring Data Redis 提供的一个用于操作 Redis 的工具类,它封装了 Redis 操作的常用方法,包括增删查改等。下面是 RedisTemplate 中常用的一些方法:

  1. 新增数据

    • opsForValue().set(key, value):设置指定 key 的值为指定的 value。
    • opsForHash().put(key, hashKey, value):将哈希表 key 中的字段 hashKey 的值设为 value。
    • opsForList().leftPush(key, value):将值 value 插入到列表 key 的表头。
  2. 删除数据

    • delete(key):删除指定的 key。
    • opsForHash().delete(key, hashKeys):删除哈希表 key 中的一个或多个指定字段。
  3. 查询数据

    • opsForValue().get(key):获取指定 key 的值。
    • opsForHash().get(key, hashKey):获取哈希表 key 中指定字段的值。
    • opsForList().range(key, start, end):获取列表 key 中指定范围内的所有值。
  4. 更新数据

    • opsForValue().set(key, value):更新指定 key 的值为指定的 value。
    • opsForHash().put(key, hashKey, value):更新哈希表 key 中的字段 hashKey 的值为 value。

 

  • 单个键对应单个属性:你原来的做法是将每个用户的手机号存储在一个单独的键中,这样的设计也是合理的。例如,你可以将用户的用户名作为键,手机号作为值,这样可以通过用户名来快速查找对应的手机号。这种设计适用于每个用户只有一个手机号的情况。

  • 单个键对应多个属性:另一种常见的设计是将用户的所有属性存储在一个哈希(Hash)数据结构中,其中键是用户的唯一标识(比如用户名或用户ID),值是一个包含用户所有属性的映射。这样可以在一个键中存储多个属性,例如用户名、手机号、邮箱等。这种设计适用于每个用户有多个属性的情况。

其他 :

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值