redis入门与springboot集成

安装与客户端的使用:https://blog.csdn.net/qq_35038153/article/details/79675728

其他参考链接:https://www.jianshu.com/p/7bf5dc61ca06/

https://blog.csdn.net/w501631338/article/details/73555908

Redis五大类型:字符串(String)、哈希/散列/字典(Hash)、列表(List)、集合(Set)、有序集合(sorted set)

结构类型 结构存储的值 结构的读写能力
String 可以是字符串、整数或者浮点数 对整个字符串或者字符串的其中一部分执行操作;对象和浮点数执行自增(increment)或者自减(decrement)
List 一个链表,链表上的每个节点都包含了一个字符串 从链表的两端推入或者弹出元素;根据偏移量对链表进行修剪(trim);读取单个或者多个元素;根据值来查找或者移除元素
Set 包含字符串的无序收集器(unorderedcollection),并且被包含的每个字符串都是独一无二的、各不相同 添加、获取、移除单个元素;检查一个元素是否存在于某个集合中;计算交集、并集、差集;从集合里卖弄随机获取元素
Hash 包含键值对的无序散列表 添加、获取、移除单个键值对;获取所有键值对
Zset(有序的Set) 字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定 添加、获取、删除单个元素;根据分值范围(range)或者成员来获取元素

其中String和Hash用的较多。redis api命令

Spring 封装了RedisTemplate来进行对redis的各种操作,支持所有redis原生的api

redisTemplate

Controller:@Resource RedisTemplate<String, String> redisTemplate;

1
2
3
4
5
6
7
8
9
10
11
redisTemplate.opsForValue();//操作字符串
redisTemplate.opsForHash();//操作hash
redisTemplate.opsForList();//操作list
redisTemplate.opsForSet();//操作set
redisTemplate.opsForZSet();//操作有序set
//redisTemplate的超时设置
redisTemplate.expire((key,timeout,timeunit)//timeout:key的生存时间,timeunit:时间单位(小时,分钟,秒…)(TimeUnit.SECONDS)
redisTemplate.getExpire(key, [timeunit])//获得超时时间
//注意:以上设置超时的方法只适用于key对应的值不再更新的问题,set方法会丢失key的生存时间,忽略而变为永久。
redisTemplate.delete(key)//redis的String删除操作
redisTemplate.set(key,value,[timeout],[timeunit])//redis的String添加操作,但不推荐,最好结合opsForValue()对字符串操作

注意:如果使用RedisTemplate需要更改序列化方式

1
2
3
4
5
RedisSerializer<String> stringSerializer = new StringRedisSerializer();
template.setKeySerializer(stringSerializer );
template.setValueSerializer(stringSerializer );
template.setHashKeySerializer(stringSerializer );
template.setHashValueSerializer(stringSerializer );

StringRedisTemplate(Redis的String数据结构)

StringRedisTemplate(推荐使用)与RedisTemplate的区别:

  • StringRedisTemplate继承RedisTemplate

  • 两者数据不可通,可以看做两种数据类型

  • SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。

    StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。

    RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

String

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
String:
1.redisTemplate.opsForValue().set(key,value));
2.redisTemplate.opsForValue().get(key));
3.redisTemplate.opsForValue().get(key, start, end);
4.redisTemplate.opsForValue().getAndSet(key, value);
5.redisTemplate.opsForValue().getBit(key, offset);
6.redisTemplate.opsForValue().multiGet(keys);
7.redisTemplate.opsForValue().setBit(key, offset, value);//通过ascii码设置String
8.redisTemplate.opsForValue().set(K key, V value, long timeout, TimeUnit unit);//详见下
9.redisTemplate.opsForValue().setIfAbsent(key, value);//详见下
10.redisTemplate.opsForValue().set(K key, V value, long offset);//详见下
11.redisTemplate.opsForValue().size(key));
12.redisTemplate.opsForValue().multiGet(Collection<K> keys);
13.redisTemplate.opsForValue().multiSetIfAbsent(Map<? extends K, ? extends V> m);
14.同8
15\16\17\18\19.redisTemplate.opsForValue().increment(K key, long delta);或.increment(K key, double delta);
20.redisTemplate.opsForValue().append(key, value);//在key键对应值的右面追加值value
21.redisTemplate.opsForValue().getOperations().delete(key);//删除
  • 8.redisTemplate.opsForValue().set(K key, V value, long timeout, TimeUnit unit);
1
2
使用:redisTemplate.opsForValue().set("name","tom",10, TimeUnit.SECONDS); 
结果:redisTemplate.opsForValue().get("name")//由于设置的是10秒失效,十秒之内查询有结果,十秒之后返回为null
  • 9.redisTemplate.opsForValue().setIfAbsent(key, value);
1
2
3
4
使用:System.out.println(redisTemplate.opsForValue().setIfAbsent("multi1","multi1"));//false  multi1之前已经存在
System.out.println(redisTemplate.opsForValue().setIfAbsent("multi111","multi111"));//true multi111之前不存在
结果:false
true
  • 10.redisTemplate.opsForValue().set(K key, V value, long offset);

    该方法是用 value 参数覆写(overwrite)给定 key 所储存的字符串值,从偏移量 offset 开始

1
2
3
4
使用:redisTemplate.opsForValue().set("key","hello world");
redisTemplate.opsForValue().set("key","redis", 6);
System.out.println("********"+redisTemplate.opsForValue().get("key"));
结果:********hello redis
  • 6.redisTemplate.opsForValue().multiGet(keys);
  • 12.redisTemplate.opsForValue().multiGet(Collection keys);
1
2
3
4
5
6
7
8
9
10
11
使用:Map<String,String> maps = new HashMap<String, String>();
maps.put("multi1","multi1");
maps.put("multi2","multi2");
maps.put("multi3","multi3");
redisTemplate.opsForValue().multiSet(maps);
List<String> keys = new ArrayList<String>();
keys.add("multi1");
keys.add("multi2");
keys.add("multi3");
System.out.println(redisTemplate.opsForValue().multiGet(keys));
结果:[multi1, multi2, multi3]
  • redisTemplate.opsForValue().increment(K key, long delta)

  • redisTemplate.opsForValue().increment(K key, double delta)

    原子递增

1
2
redisTemplate.opsForValue().increment(key,1)	//1
redisTemplate.opsForValue().increment(key,1.2) //2.2
编号 命令 描述说明
1 SET key value 此命令设置指定键的值。
2 GET key 获取指定键的值。
3 GETRANGE key start end 获取存储在键上的字符串的子字符串。
4 GETSET key value 设置键的字符串值并返回其旧值。
5 GETBIT key offset 返回在键处存储的字符串值中偏移处的位值。
6 MGET key1 [key2..] 获取所有给定键的值
7 SETBIT key offset value 存储在键上的字符串值中设置或清除偏移处的位
8 SETEX key seconds value 使用键和到期时间来设置值
9 SETNX key value 设置键的值,仅当键不存在时
10 SETRANGE key offset value 在指定偏移处开始的键处覆盖字符串的一部分
11 STRLEN key 获取存储在键中的值的长度
12 MSET key value [key value …] 为多个键分别设置它们的值
13 MSETNX key value [key value …] 为多个键分别设置它们的值,仅当键不存在时
14 PSETEX key milliseconds value 设置键的值和到期时间(以毫秒为单位)
15 INCR key 将键的整数值增加1
16 INCRBY key increment 将键的整数值按给定的数值增加
17 INCRBYFLOAT key increment 将键的浮点值按给定的数值增加
18 DECR key 将键的整数值减1
19 DECRBY key decrement 按给定数值减少键的整数值
20 APPEND key value 将指定值附加到键

Hash

1
2
3
4
5
6
7
8
9
10
11
12
13
Hash:
1.redisTemplate.opsForHash().delete(H key, Object... hashKeys);//...表示可以传入多个map的key,用,隔开。或用数组传值
2.redisTemplate.opsForHash().hasKey(key, hashKey);
3.redisTemplate.opsForHash().get(key, hashKey);
4.redisTemplate.opsForHash().entries(key);//返回map集合
56.redisTemplate.opsForHash().increment(H key, HK hashKey, long delta);//或increment(H key, HK hashKey, double delta);;
7.redisTemplate.opsForHash().keys(key);//返回map的key集合Set
8.redisTemplate.opsForHash().size(key);
9.redisTemplate.opsForHash().multiGet(H key, Collection<HK> hashKeys);
10.redisTemplate.opsForHash().putAll(H key, Map<? extends HK, ? extends HV> m);
11.redisTemplate.opsForHash().put(key, hashKey, value);
12.redisTemplate.opsForHash().putIfAbsent(key, hashKey, value);
13.redisTemplate.opsForHash().values(key);//返回map中的value集合List;
序号 命令 说明
1 HDEL key field2 [field2] 删除一个或多个哈希字段。
2 HEXISTS key field 判断是否存在散列字段。
3 HGET key field 获取存储在指定键的哈希字段的值。
4 HGETALL key 获取存储在指定键的哈希中的所有字段和值
5 HINCRBY key field increment 将哈希字段的整数值按给定数字增加
6 HINCRBYFLOAT key field increment 将哈希字段的浮点值按给定数值增加
7 HKEYS key 获取哈希中的所有字段
8 HLEN key 获取散列中的字段数量
9 HMGET key field1 [field2] 获取所有给定哈希字段的值
10 HMSET key field1 value1 [field2 value2 ] 为多个哈希字段分别设置它们的值
11 HSET key field value 设置散列字段的字符串值
12 HSETNX key field value 仅当字段不存在时,才设置散列字段的值
13 HVALS key 获取哈希中的所有值

List

1
2
3
4
5
6
7
8
9
10
11
12
List:

redisTemplate.opsForList().leftPush(key, value);//从左向右存压栈
redisTemplate.opsForList().leftPop(key);//从左出栈
redisTemplate.opsForList().size(key);//队/栈长
redisTemplate.opsForList().range(key, start, end);//范围检索,返回List
redisTemplate.opsForList().remove(key, i, value);//移除key中值为value的i个,返回删除的个数;如果没有这个元素则返回0
redisTemplate.opsForList().index(key, index);//检索
redisTemplate.opsForList().set(key, index, value);//赋值
redisTemplate.opsForList().trim(key, start, end);//裁剪,void,删除除了[start,end]以外的所有元素
redisTemplate.opsForList().rightPopAndLeftPush(String sourceKey, String destinationKey);//将源key的队列的右边的一个值删除,然后塞入目标key的队列的左边,返回这个值
注意:要缓存的对象必须实现Serializable接口,因为 Spring 会将对象先序列化再存入 Redis,否则报异常nested exception is java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable……
序号 命令 说明
1 BLPOP key1 [key2 ] timeout 删除并获取列表中的第一个元素,或阻塞,直到有一个元素可用
2 BRPOP key1 [key2 ] timeout 删除并获取列表中的最后一个元素,或阻塞,直到有一个元素可用
3 BRPOPLPUSH source destination timeout 从列表中弹出值,将其推送到另一个列表并返回它; 或阻塞,直到一个可用
4 LINDEX key index 通过其索引从列表获取元素
5 LINSERT key BEFORE/AFTER pivot value 在列表中的另一个元素之前或之后插入元素
6 LLEN key 获取列表的长度
7 LPOP key 删除并获取列表中的第一个元素
8 LPUSH key value1 [value2] 将一个或多个值添加到列表
9 LPUSHX key value 仅当列表存在时,才向列表添加值
10 LRANGE key start stop 从列表中获取一系列元素
11 LREM key count value 从列表中删除元素
12 LSET key index value 通过索引在列表中设置元素的值
13 LTRIM key start stop 修剪列表的指定范围
14 RPOP key 删除并获取列表中的最后一个元素
15 RPOPLPUSH source destination 删除列表中的最后一个元素,将其附加到另一个列表并返回
16 RPUSH key value1 [value2] 将一个或多个值附加到列表
17 RPUSHX key value 仅当列表存在时才将值附加到列表

Set

1
2
Set:
redisTemplate.opsForValue().getAndSet(key, value)
序号 命令 说明
1 SADD key member1 [member2] 将一个或多个成员添加到集合
2 SCARD key 获取集合中的成员数
3 SDIFF key1 [key2] 减去多个集合
4 SDIFFSTORE destination key1 [key2] 减去多个集并将结果集存储在键中
5 SINTER key1 [key2] 相交多个集合
6 SINTERSTORE destination key1 [key2] 交叉多个集合并将结果集存储在键中
7 SISMEMBER key member 判断确定给定值是否是集合的成员
8 SMOVE source destination member 将成员从一个集合移动到另一个集合
9 SPOP key 从集合中删除并返回随机成员
10 SRANDMEMBER key [count] 从集合中获取一个或多个随机成员
11 SREM key member1 [member2] 从集合中删除一个或多个成员
12 SUNION key1 [key2] 添加多个集合
13 SUNIONSTORE destination key1 [key2] 添加多个集并将结果集存储在键中
14 SSCAN key cursor [MATCH pattern] [COUNT count] 递增地迭代集合中的元素

String…与String[]的区别

类型后面三个点(String…),是从Java 5开始,Java语言对方法参数支持一种新写法,叫可变长度参数列表,其语法就是类型后跟 ,表示此处接受的参数为0到多个Object类型的对象,或者是一个Object[]。所以如果你有了xxx(String… strs)就不能再有xxx(String[]),三个点的写法包含了第二种。


2018/12/11更新

spring-data-redis

​ 上面介绍了StingRedisTemplate的一些基本方法,上周末喜提一个新的项目,(^▽^) 项目比之前的大,功能很多,而且创始者还不爱打注释!这真的让我非常头疼

​ 好了回归主题,我看到代码里有一段

1
2
3
4
5
6
@Autowired
private StringRedisTemplate stringRedisTemplate;

private BoundHashOperations<String, Object, Object> hashOps() {
return stringRedisTemplate.boundHashOps("sutSub");
}

​ 看到StringRedisTemplate有些熟悉,刚入职的时候学了,是Redis的String数据结构,boundHashOps()没见过啊,这其实是一个RedisTemplate的方法,而StringRedisTemplate继承自它,所以告诉我他与get()的区别?

​ 好像只是为了简化opsForValue()一步,好吧似乎真的只是这样而已,spring-data-redis提供了对key的“bound”便捷化API,为啥要用bound这个名字呢emmm… 可以通过bound封装指定的key操作redis里的数据,有

BoundValueOperations
BoundSetOperations
BoundListOperations
BoundSetOperations
BoundHashOperations

注意,这个spring-data-redis和put普通的spring-redis有一小点区别,jar包名字的区别…s一个叫spring-boot-data-redis,一个叫spring-boot-start-redis,都是基于Jedis的,所以其实没区别。