前情提要:操作前提为在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
中常用的一些方法:
-
新增数据:
opsForValue().set(key, value)
:设置指定 key 的值为指定的 value。opsForHash().put(key, hashKey, value)
:将哈希表 key 中的字段 hashKey 的值设为 value。opsForList().leftPush(key, value)
:将值 value 插入到列表 key 的表头。
-
删除数据:
delete(key)
:删除指定的 key。opsForHash().delete(key, hashKeys)
:删除哈希表 key 中的一个或多个指定字段。
-
查询数据:
opsForValue().get(key)
:获取指定 key 的值。opsForHash().get(key, hashKey)
:获取哈希表 key 中指定字段的值。opsForList().range(key, start, end)
:获取列表 key 中指定范围内的所有值。
-
更新数据:
opsForValue().set(key, value)
:更新指定 key 的值为指定的 value。opsForHash().put(key, hashKey, value)
:更新哈希表 key 中的字段 hashKey 的值为 value。
-
单个键对应单个属性:你原来的做法是将每个用户的手机号存储在一个单独的键中,这样的设计也是合理的。例如,你可以将用户的用户名作为键,手机号作为值,这样可以通过用户名来快速查找对应的手机号。这种设计适用于每个用户只有一个手机号的情况。
-
单个键对应多个属性:另一种常见的设计是将用户的所有属性存储在一个哈希(Hash)数据结构中,其中键是用户的唯一标识(比如用户名或用户ID),值是一个包含用户所有属性的映射。这样可以在一个键中存储多个属性,例如用户名、手机号、邮箱等。这种设计适用于每个用户有多个属性的情况。
其他 :