黑马Redis学习笔记
Redis是一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件。是一种非关系型数据库
官网: https://redis.io 中文网: https://www.redis.net.cn/
安装过程省略
一、连接方式
1、打开Redis
默认端口6379
![2]()
2、通过redis-cil.exe连接
![3]()
二、Redis数据类型
Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:
-
字符串 string
-
哈希 hash
-
列表 list
-
集合 set
-
有序集合 sorted set / zset
1、字符串操作命令
| 指令 |
含义 |
| SET key value |
设置指定key的值 |
| GET key |
获取指定key的值 |
| SETEX key seconds value |
设置指定key的值,并将 key 的过期时间设为 seconds 秒 |
| SETNX key value |
只有在 key 不存在时设置 key 的值 |
![4]()
2、哈希操作命令
| 指令 |
含义 |
| HSET key field value |
将哈希表 key 中的字段 field 的值设为 value |
| HGET key field |
获取存储在哈希表中指定字段的值 |
| HDEL key field |
删除存储在哈希表中的指定字段 |
| HKEYS key |
获取哈希表中所有字段 |
| HVALS key |
获取哈希表中所有值 |
![5]()
3、列表操作命令
有序列表
| 指令 |
含义 |
| LPUSH key value1 [value2] |
将一个或多个值插入到列表头部 |
| LRANGE key start stop |
获取列表指定范围内的元素 |
| RPOP key |
移除并获取列表最后一个元素 |
| LLEN key |
获取列表长度 |
| BRPOP key1 [key2] timeout |
移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 |
![6]()
4、集合操作命令
无序集合
| 指令 |
含义 |
| SADD key member1 [member2] |
向集合添加一个或多个成员 |
| SMEMBERS key |
返回集合中的所有成员 |
| SCARD key |
获取集合的成员数 |
| SINTER key1 [key2] |
返回给定所有集合的交集 |
| SUNION key1 [key2] |
返回所有给定集合的并集 |
| SREM key member1 [member2] |
移除集合中一个或多个成员 |
![7]()
5、有序集合操作命令
| 指令 |
含义 |
| ZADD key score1 member1 [score2 member2] |
向有序集合添加一个或多个成员 |
| ZRANGE key start stop [WITHSCORES] |
通过索引区间返回有序集合中指定区间内的成员 |
| ZINCRBY key increment member |
有序集合中对指定成员的分数加上增量 increment |
| ZREM key member [member …] |
移除有序集合中的一个或多个成员 |
![8]()
6、通用命令
| 指令 |
含义 |
| KEYS pattern |
查找所有符合给定模式( pattern)的 key |
| EXISTS key |
检查给定 key 是否存在 |
| TYPE key |
返回 key 所储存的值的类型 |
| DEL key |
该命令用于在 key 存在是删除 key |
![9]()
三、在Java中操作Redis
1、使用Spring Data Redis
1 2 3 4
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
|
Spring Data Redis中提供了一个高度封装的类:RedisTemplate,对相关api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:
-
ValueOperations:string数据操作
-
SetOperations:set类型数据操作
-
ZSetOperations:zset类型数据操作
-
HashOperations:hash类型的数据操作
-
ListOperations:list类型的数据操作
2、配置数据源
application.yaml中添加
1 2 3 4 5 6
| sky: redis: host: localhost port: 6379 password: 123456 database: 10
|
3、编写配置类
笔者以为,先创建一个redis模版对象,此时要用redis的连接工厂对象提供与redis的连接。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| @Configuration @Slf4j public class RedisConfiguraion {
@Bean public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){ log.info("开始创建redis模版对象..."); RedisTemplate redisTemplate = new RedisTemplate(); redisTemplate.setConnectionFactory(redisConnectionFactory); redisTemplate.setKeySerializer(new StringRedisSerializer()); return redisTemplate; }
}
|
解释说明:
当前配置类不是必须的,因为 Spring Boot 框架会自动装配 RedisTemplate 对象,但是默认的key序列化器为
JdkSerializationRedisSerializer,导致我们存到Redis中后的数据和原始数据有差别,故设置为
StringRedisSerializer序列化器。
4、代码
| 描述 |
代码 |
| string数据操作 |
ValueOperations valueOperations = redisTemplate.opsForValue(); |
| hash类型的数据操作 |
HashOperations hashOperations = redisTemplate.opsForHash(); |
| list类型的数据操作 |
ListOperations listOperations = redisTemplate.opsForList(); |
| set类型数据操作 |
SetOperations setOperations = redisTemplate.opsForSet(); |
| zset类型数据操作 |
ZSetOperations zSetOperations = redisTemplate.opsForZSet(); |
1). 操作字符串类型数据
1 2 3 4 5 6 7 8 9 10 11 12 13
|
@Test public void testString(){ redisTemplate.opsForValue().set("name","小明"); String city = (String) redisTemplate.opsForValue().get("name"); System.out.println(city); redisTemplate.opsForValue().set("code","1234",3, TimeUnit.MINUTES); redisTemplate.opsForValue().setIfAbsent("lock","1"); redisTemplate.opsForValue().setIfAbsent("lock","2"); }
|
2). 操作哈希类型数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
@Test public void testHash(){ HashOperations hashOperations = redisTemplate.opsForHash();
hashOperations.put("100","name","tom"); hashOperations.put("100","age","20");
String name = (String) hashOperations.get("100", "name"); System.out.println(name);
Set keys = hashOperations.keys("100"); System.out.println(keys);
List values = hashOperations.values("100"); System.out.println(values);
hashOperations.delete("100","age"); }
|
3). 操作列表类型数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
@Test public void testList(){ ListOperations listOperations = redisTemplate.opsForList();
listOperations.leftPushAll("mylist","a","b","c"); listOperations.leftPush("mylist","d");
List mylist = listOperations.range("mylist", 0, -1); System.out.println(mylist);
listOperations.rightPop("mylist");
Long size = listOperations.size("mylist"); System.out.println(size); }
|
4). 操作集合类型数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
@Test public void testSet(){ SetOperations setOperations = redisTemplate.opsForSet();
setOperations.add("set1","a","b","c","d"); setOperations.add("set2","a","b","x","y");
Set members = setOperations.members("set1"); System.out.println(members);
Long size = setOperations.size("set1"); System.out.println(size);
Set intersect = setOperations.intersect("set1", "set2"); System.out.println(intersect);
Set union = setOperations.union("set1", "set2"); System.out.println(union);
setOperations.remove("set1","a","b"); }
|
5). 操作有序集合类型数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
@Test public void testZset(){ ZSetOperations zSetOperations = redisTemplate.opsForZSet();
zSetOperations.add("zset1","a",10); zSetOperations.add("zset1","b",12); zSetOperations.add("zset1","c",9);
Set zset1 = zSetOperations.range("zset1", 0, -1); System.out.println(zset1);
zSetOperations.incrementScore("zset1","c",10);
zSetOperations.remove("zset1","a","b"); }
|
6). 通用命令操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
@Test public void testCommon(){ Set keys = redisTemplate.keys("*"); System.out.println(keys);
Boolean name = redisTemplate.hasKey("name"); Boolean set1 = redisTemplate.hasKey("set1");
for (Object key : keys) { DataType type = redisTemplate.type(key); System.out.println(type.name()); }
redisTemplate.delete("mylist"); }
|