Redis(三)redisTemplate实操和五种基础数据类型
前⾔
采⽤SpringBoot⾃动注⼊的jedis模板redisTemplate进⾏操作以及Redis的五种基础数据类型,其⾃带连接池管理,可⾃定义:为了中⽂存储和对象存储。【后续可能会把⾃定义模板放这⾥,基础类型单独提出去】。
导⼊依赖
<!-- Redis依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
jedis⽤到的依赖(new Jedis(ip,port),⽤于jedis⽰例)
<!--redis客户端 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
设置application.properties
#集模式
#单节点
#dis.host=xxx
#dis.port=6379
#dis.password=xxx
#dis.pool.max-active=8 ## 设置最⼤连接数,0为⽆限
实例代码
这⾥再main函数中是⽆法运⾏的,因为⾃动装配的对象需要再SpringBoot容器启动后才能装配,故此通过在Spring容器中单元测试的⽅式来测试:,已经单独列⽂说明,不再累述。
@Autowired
private RedisTemplate<String, Object> redisTemplate;
private void doEasy() {
// TODO Auto-generated method stub
redisTemplate.opsForValue().set("redisTemplate", "hello redisTemplate , i will use u as a tool");
}
public static void main(String[] args) {
new RedisBase().doEasy();
}
五种基础数据类型
,详细更见。
String(字符串): string类型时⼆进制安全的,意思就是可以存储任何数据;
Hash(哈希): 类似于map : java中的Map<String,Object>;
List(列表):实际上是链表,可以添加任何⼀个元素在表头或者表位;
Set(集合):⽆序⽆重复;
Zset(有序集合):跟set⼀样也是string类型元素的集合。关联⼀个double分数。
String
redisTemplate.opsForValue().set();
redisTemplate.opsForValue().get();
Hash
//Redis hash 是⼀个 string 类型的 field(字段)和 value(值)的映射表,hash 特别适合⽤于存储对象。 Redis 中每个 hash 可以存储 232 - 1 键值对 private void hash() {
Map userInfo = new HashMap<>();
userInfo.put("name", "Lucy");
userInfo.put("description", "a cool girl");
//put : (map的key, hashkey(name等),value
redisTemplate.opsForHash().put("userInfo", "sex", "Female");
//putAll:放⼊map对象
redisTemplate.opsForHash().putAll("userInfo", userInfo);
//values参数key对应的map值,返回结果为List<Object> ,keys⽅法也类似
//delete删除对应的字段
redisTemplate.opsForHash().delete("userInfo", "name");
//确定字段是否在map中存在,bool类型
Boolean is_save = redisTemplate.opsForHash().hasKey("userInfo", "name");
//multiGet,获取多个值
Collection<Object> keys = new ArrayList<>();
keys.add("name");
keys.add("sex");
System.out.println(redisTemplate.opsForHash().multiGet("userInfo", keys));
}
List
List实现数据结构是双端链表。
public void list() {
List userInfo = new ArrayList();
redisTemplate.delete("userInfo");
userInfo.add("Nancy");
userInfo.add("a sunny girl");
redisTemplate.opsForList().leftPush("userInfo", "first String before nancy");
redisTemplate.opsForList().leftPush("userInfo", "second String before nancy");
//左右插⼊l/rpush , all 是集合
redisTemplate.opsForList().rightPushAll("userInfo", userInfo);
(待完善)
L / Rpush——链表头尾(左右插⼊元素)
Lrange——模板中是range,返回区间值,0 到 -1是返回全集
L / Rpop——头尾(左右)出栈,会删除元素
Lindex——根据索引,取出元素
Llen——链表长度,元素个数
Lrem——根据key,删除n个value
Ltrim——根据索引,删除指定元素
Rpoplpush——出栈,⼊栈
Lset——根据index,设置value
Linsert before——根据value,在之前插⼊值
Linsert after——根据value,在之后插⼊值
Set
具体操作参考:
add
remove
pop //出并删除元素
move //将集合1中的指定元素移到集合2
isMember //是否存在元素
randomMember //随机取元素
members //遍历元素
Zset
官⽹:
Redis 有序集合和集合⼀样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联⼀个double类型的分数。redis正是通过分数来为集合中的成员进⾏从⼩到⼤的排序。
有序集合的成员是唯⼀的,但分数(score)却可以重复。
1:zadd:添加元素,格式是zadd zset的key score值项的值,Score和项可以是多对,score可以是整数,
也可以是浮点数,还可以是+inf表⽰正⽆穷⼤,-inf表⽰负⽆穷⼤
2:zrange:获取索引区间内的元素
3:zrangebyscore:获取分数区间内的元素
4:zrem:删除元素,格式是zrem zset的key 项的值,项的值可以是多个
5:zcard:获取集合中元素个数,格式是zcard zset的key
6:zincrby:增减元素的Score,格式是zincrby zset的key 正负数字项的值
7:zcount:获取分数区间内元素个数,格式是zcount zset的key 起始score 终⽌score
redis五种数据结构8:zrank:获取项在zset中的索引,格式是zrank zset的key 项的值
9:zscore:获取元素的分数,格式是zscore zset的key 项的值,返回项在zset中的score
10:zrevrank:获取项在zset中倒序的索引,格式是zrevrank zset的key 项的值
11:zrevrange:获取索引区间内的元素,格式是zrevrange zset的key 起始索引终⽌索引(withscores)
插曲
使⽤完Hash后再在同⼀个字段插⼊List有报错:
org.dis.RedisSystemException: Error in execution; nested exception is RedisCommandExecutionException:
WRONGTYPE Operation against a key holding the wrong kind of value
原因: 可能是有同名Key写⼊不同类型值导致的问题。⽐如说:存进去是hash,去除操作⽤了list的操作。
解决⽅案:删除key重新写⼊:
redisTemplate.delete("userInfo");
如果对你有所帮助点个赞,给点⼩动⼒,谢谢啦~
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论