springboot使用redis步骤
1.添加依赖
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方式的序列化
java的序列化 : 把java对象转换为byte[],二进制数据
json序列化 : json序列化功能将对象转换为json格式或者将其转换回对象,如Student对象转换为{“name”:“张三”,“age”:“20”}
Redis数据类型操作命令和Spring Boot对应方法
1.字符串类型(string)
字符串是Redis中最为基本的数据类型之一,也是能够储存任何格式的值,如 png 图片或 JSON 数据等等。
常用命令
-
设置指定 key 的值
set key valuepublic void set(String key, Object value) { redisTemplate.opsForValue().set(key, value); } 123 -
获取指定 key 的值
get keypublic 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 keypublic 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 keypublic Long strlen(String key) { return redisTemplate.opsForValue().size(key); } 123 -
将键存储的数字减一
decr keypublic Long decr(String key) { return redisTemplate.opsForValue().decrement(key); } 123 -
将键存储的数字加一
incr keypublic Long incr(String key) { return redisTemplate.opsForValue().increment(key); } 123
2. 列表类型(list)
列表 (list) 是强大的工具,它可以允许你执行范围访问并且(从两端)添加和弹出元素。
常用命令:
-
从队列左边入队一个元素
lpush key elementpublic void lpush(String key, Object value) { redisTemplate.opsForList().leftPush(key, value); } 123 -
从队列右边入队一个元素
rpush key elementpublic void rpush(String key, Object value) { redisTemplate.opsForList().rightPush(key, value); } 123 -
从队列左边弹出/删除一个元素
lpop keypublic Object lpop(String key) { return redisTemplate.opsForList().leftPop(key); } 123 -
从队列右边弹出/删除一个元素
rpop keypublic Object rpop(String key) { return redisTemplate.opsForList().rightPop(key); } 123 -
获取指定范围内的所有元素, start 和 end 都是从0开始的索引值
lrange key start endpublic List<Object> lrange(String key, int start, int stop) { return redisTemplate.opsForList().range(key, start, stop); } 123 -
获取指定 key 中的元素个数
llen keypublic long llen(String key) { return redisTemplate.opsForList().size(key); } 123
3.哈希类型(hash)
哈希表 (hash) 就像一个关联数组,其中字符串类型的字段和值之间存在映射关系。
常用命令:
-
哈希表设置值
hset key field valuepublic void hset(String key, String field, Object value) { redisTemplate.opsForHash().put(key, field, value); } -
获取哈希表中指定字段的值
hget key fieldpublic Object hget(String key, String field) { return redisTemplate.opsForHash().get(key, field); } -
获取哈希表所有的字段和值
hgetall keypublic Map<Object, Object> hgetAll(String key) { return redisTemplate.opsForHash().entries(key); } -
删除哈希表指定字段的值
hdel key fieldpublic 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 memberpublic long sadd(String key, Object... values) { return redisTemplate.opsForSet().add(key, values); } -
查询集合中的所有元素
smembers keypublic Set<Object> smembers(String key) { return redisTemplate.opsForSet().members(key); } -
返回集合中的元素个数
scard keypublic long scard(String key) { return redisTemplate.opsForSet().size(key); } -
删除集合中指定元素
srem key memberpublic long srem (String key, Object... values) { try { Long count = redisTemplate.opsForSet().remove(key, values); return count; } catch (Exception e) { e.printStackTrace(); return 0; } }