数据类型
Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:
-
字符串 ——
string -
哈希 ——
hash适合存储对象。
-
列表 ——
list按照插入顺序排序,可以有重复元素。可以用来做任务队列。
-
集合 ——
set无序集合,没有重复元素(后插入的元素会覆盖已有的相同元素)。
-
有序集合 ——
sorted set有序集合(使用分值进行排序),没有重复元素。
常用命令
Redis命令符不区分大小写,但是
key是区分大小写的。 更多命令请参考Redis中文网。
字符串操作命令
1SET key value
- 设置指定
key的值。 key相同的情况下,后设的值会覆盖前面的值。
1GET key
- 获取指
key的值。
1SETEX key seconds value
- 设置指定
key的值,并将key的过期时间设为seconds秒。
1SETNX key value
-
只有在
key不存在时设置key的值。 -
如:
1> SETNX key1 value1 21 3> SETNX key1 value2 40 5> GET key1 6value1
哈希操作命令
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
1HSET key field value
- 将哈希表key种的字段field的值设为value。
1HGET key field
- 获取存储在哈希表中指定字段的值。
1HDEL key field
- 删除存储在哈希表中的指定字段。
1HKEYS key
- 获取哈希表中所有字段。
1HVALS key
- 获取哈希表中所有值。
1HGETALL key
- 获取在哈希表中指定key的所有字段和值。
列表操作命令
1LPUSH key value1 [value2 ...]
- 将一个或多个值插入到列表头部。
1LRANGE key start stop
- 获取列表指定范围内的元素(
start到stop,索引从0开始)。
1RPOP key
- 移除并获取列表最后一个元素。
1LLEN key
- 获取列表长度。
1BRPOP key1 [key2 ...] timeout
- 移除并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时(
timeout秒)或(在指定的key中)发现可弹出元素为止。
集合操作命令
Redis set是string类型的无序集合,集合成员是唯一的。
1SADD key member1 [member2 ...]
- 向集合添加一个或多个成员。
1SMEMBERS key
- 返回集合中的所有成员。
1SCARD key
- 获取集合的成员数。
1SINTER key1 [key2 ...]
- 返回给定所有集合的交集。
1SUNION key1 [key2 ...]
- 返回所有给定集合的并集。
1SDIFF key1 [key2 ...]
- 返回给定所有集合的差集(左差集,即key1集合中在其他集合没有的元素集合)。
1SREM key member1 [member2 ...]
- 移除集合中一个或多个成员。
有序集合操作命令
Redis sorted set 是string类型元素的集合,且不允许重复的成员。每个元素都会关联一个double类型的分数(score)。Redis通过分数来为集合中的成员进行从小到大排序,有序集合的成员是唯一的,但分数却可以重复。
1ZADD key score1 member1 [score2 member2 ...]
- 向有序集合添加一个或多个成员,或者更新已存在成员的分数。
1ZRANGE key start stop [WITHSCOES]
- 通过索引区间返回有序集合中指定区间内的成员。使用
WITHSCOES可以返回成员的分数。
1ZINCRBY key increment member
- 有序集合中对指定成员的分数加上增量
increment。
1ZREM key member [member ...]
- 移除有序集合中的一个或多个成员。
通用命令
1KEYS pattren
- 查找所有符合给定模式(pattern)的key。
1EXISTS key
- 检查给定key是否存在。
1TYPE key
- 返回key所存储的值的类型。
1TTL key
- 返回给定key的剩余生存时间(TTL,time to live),以秒为单位。
1DEL key1 [key2 ...]
-
该命令用于在key存在时删除key。
-
如:
1> TTL key 2-1返回
-1表示永久存活。
切换数据库
Redis 默认是在0号数据库中执行操作。如果想要切换数据库,可以使用:
1SELECT number
如:
1127.0.0.1:6379> SELECT 1
2OK
3127.0.0.1:6379[1]>
Redis 默认提供了16个数据库。
要修改该配置可以在redis.conf中修改databases的数量。
1databash 16
Spring Data Redis
依赖
Spring Data Redis的依赖坐标为:
1<!-- Spring Date Redis -->
2<dependency>
3 <groupId>org.springframework.boot</groupId>
4 <artifactId>spring-boot-starter-data-redis</artifactId>
5 <!-- version在spring-boot-starter-parent中定义 -->
6</dependency>
配置
application.yml:
1spring:
2 application:
3 name: springdataredis-demo
4 # Redis相关配置
5 data:
6 redis:
7 host: localhost
8 port: 6379
9 password: 123456
10 database: 0 # 操作0号数据库
11 jedis:
12 # Redis连接池配置
13 pool:
14 max-active: 8 # 最大连接数
15 max-wait: 1ms # 连接池最大阻塞等待时间
16 max-idle: 4 # 连接池中的最大空闲连接
17 min-idle: 0 # 连接池中的最小空闲连接
配置类(修改默认序列化器,防止因序列化在Redis上产生乱码,但并不妨碍读值。因为读取时会自动反序列化):
1@Configuration
2public class RedisConfig extends CachingConfigurerSupport {
3
4 @Bean
5 public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
6
7 RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
8
9 // 默认的Key序列化器为:JdkSerializationRedisSerializer
10 redisTemplate.setKeySerializer(new StringRedisSerializer());
11 redisTemplate.setHashKeySerializer(new StringRedisSerializer());
12
13 redisTemplate.setConnectionFactory(connectionFactory);
14
15 return redisTemplate;
16 }
17
18}
测试
1@SpringBootTest
2@RunWith(SpringRunner.class)
3public class SpringDataRedisTest {
4 @Autowired
5 private RedisTemplate redisTemplate;
6
7 /**
8 * 操作字符串类型数据
9 */
10 @Test
11 public void testString() {
12 // 获得String类型数据操作对象
13 ValueOperations valueOperations = redisTemplate.opsForValue();
14
15 valueOperations.set("city", "guangzhou");
16
17 String city = (String) valueOperations.get("city");
18 System.out.println(city);
19
20 // 设置超时
21 valueOperations.set("key1", "value1", 10L, TimeUnit.SECONDS);
22
23 // 不存在才设置
24 Boolean setIfAbsent1 = valueOperations.setIfAbsent("city", "foshang");
25 System.out.println(Boolean.TRUE.equals(setIfAbsent1) ? "city设置成功" : "city已存在");
26 Boolean setIfAbsent2 = valueOperations.setIfAbsent("city_name", "foshang",
27 10L, TimeUnit.SECONDS);
28 Object cityName = valueOperations.get("city_name");
29 System.out.println(setIfAbsent2 ? "city_name设置成功:" + cityName
30 : "city_name已存在");
31 }
32
33 /**
34 * 操作哈希类型数据
35 */
36 @Test
37 public void testHash() {
38 HashOperations hashOperations = redisTemplate.opsForHash();
39
40 String id = "002";
41 // 存值
42 hashOperations.put(id, "name", "xiaoming");
43 hashOperations.put(id, "age", "20");
44 hashOperations.put(id, "address", "guangzhou");
45
46 // 取值
47 String name = (String) hashOperations.get(id, "name");
48 String age = (String) hashOperations.get(id, "age");
49 String address = (String) hashOperations.get(id, "address");
50 System.out.println("name:" + name + ",age:" + age + ",address:" + address);
51
52 // 获取hash结构中的所有字段
53 Set keys = hashOperations.keys(id);
54 for (Object key : keys) {
55 System.out.println(key);
56 }
57
58 // 删除
59 //hashOperations.delete(keys, "address", "age");
60
61 // 获得hash结构中的所有值
62 List<String> values = hashOperations.values(id);
63 for (String value : values) {
64 System.out.println(value);
65 }
66 }
67
68 /**
69 * 操作列表类型数据
70 */
71 @Test
72 public void testList() {
73 ListOperations listOperations = redisTemplate.opsForList();
74
75 String key = "mylist";
76 // 存储
77 listOperations.leftPush(key, "a");
78 listOperations.leftPushAll(key, "b", "c", "d");
79
80 // 取值
81 System.out.printf("入队:");
82 List<String> myList = listOperations.range(key, 0, -1);
83 for (String s : myList) {
84 System.out.printf(s + " ");
85 }
86 System.out.println();
87
88 // 获得列表长度 llen
89 int size = listOperations.size(key).intValue();
90 System.out.printf("出队:");
91 for (int i = 0; i < size; i++) {
92 // 出队列
93 String element = (String) listOperations.rightPop(key);
94 System.out.printf(element + " ");
95 }
96 System.out.println();
97 }
98
99 /**
100 * 操作集合类型数据
101 */
102 @Test
103 public void testSet() {
104 SetOperations setOperations = redisTemplate.opsForSet();
105
106 String key = "myset";
107 // 存值
108 setOperations.add(key, "a", "b", "c", "d", "a");
109
110 // 取值
111 Set<String> myset = setOperations.members(key);
112 for (String s : myset) {
113 System.out.printf(s + " ");
114 }
115 System.out.println();
116
117 // 删除成员
118 setOperations.remove(key, "a", "b");
119
120 // 取值
121 myset = setOperations.members(key);
122 for (String s : myset) {
123 System.out.printf(s + " ");
124 }
125 System.out.println();
126 }
127
128 /**
129 * 操作有序集合类型数据
130 */
131 @Test
132 public void testZset() {
133 ZSetOperations zSetOperations = redisTemplate.opsForZSet();
134
135 String key = "myZset";
136 // 存储
137 zSetOperations.add(key, "a", 10.);
138 zSetOperations.add(key, "b", 11.);
139 zSetOperations.add(key, "c", 12.);
140 zSetOperations.add(key, "d", 13.);
141 zSetOperations.add(key, "a", 14.);
142
143 // 取值
144 Set<String> range = zSetOperations.range(key, 0, -1);
145 for (String s : range) {
146 System.out.printf(s + " ");
147 }
148 System.out.println();
149
150 // 修改分数
151 zSetOperations.incrementScore(key, "b", 20.);
152
153 // 删除成员
154 zSetOperations.remove(key, "a", "c");
155
156 // 取值
157 range = zSetOperations.range(key, 0, -1);
158 for (String s : range) {
159 System.out.printf(s + " ");
160 }
161 System.out.println();
162 }
163
164 /**
165 * 通用操作
166 */
167 @Test
168 public void testCommon() {
169 // 获取Redis中所有key
170 Set<String> keys = redisTemplate.keys("*");
171 for (String key : keys) {
172 System.out.println(key);
173 }
174
175 // 判断m某个key是否存在
176 Boolean hasKey = redisTemplate.hasKey("linner");
177 System.out.println(hasKey ? "linner存在" : "linner不存在");
178
179 // 删除指定key
180 redisTemplate.delete("myZset");
181
182 // 获取指定key对应的value的数据类型
183 DataType dataType = redisTemplate.type("myset");
184 System.out.println(dataType.name());
185 }
186}
评论