Redis总结

Redis入门

[TOC]

概述

🤣🤣🤣🤣🤣🤣🤣🤣🤣🤣

首先数据库分为关系型和非关系型的数据库

关系型:Mysql

非关系型:Redis

Redis是一个开源的,C语言进行编写的非关系型数据库,他将数据存储在内存中,对于数据的读取速度很快,处理高并发非常方便

Redis的优势

  • Redis采用键值对的方式进行数据的存储,解决了传统的关系型数据库对于高并发处理的缺陷,能够快速、完美地解决高并发问题

  • 它的数据保存在内存中,存取速度快

  • 支持的存储方式有很多类型,例如String、List、Set、ZSet和Hash

  • Redis支持集群

  • 支持持久化,可以把内存中的数据持久化到磁盘上面

  • 支持订阅和发布功能

Redis的使用场景

Redis的使用场景包括但不仅限于以下方面

中央缓存

作为计数器来使用

实时攻击防护(防暴力破解)

设置有效期

队列功能(秒杀)

消息订阅系统

Redis常用命令

对Key的常用操作

  • key *:获取所有的key
  • del key:删除key
  • expire key xx:设置key的过期时间(xx秒后过期)
  • ttl key:查看key的过期时间
  • flushall:清空整个redis服务器中的数据
  • flushdb:清空当前数据库中的所有数据(redis默认16个数据库)
  • select xx:选择xx数据库

String型

  • set key value:设置相应的key和value
  • get key:获取相关key的value值
  • mset:同时设置多对key和value
  • mget:同时获取多对key和value
  • incr key:将key中存储的数字值+1(注意:必须是数值型)
  • decr key:将key中存储的数字值+1(注意:必须是数值型)
  • incrby key:设置自增多少
  • decrby key:设置自减多少

List型

List集合是一个有序可重复的队列

  • lpush key value:将一个或多个值从左到右插入到list集合中
  • rpush key value:将一个或多个值从右到左插入到list集合中
  • lpop key:从左边开始移除key值
  • rpop key:从右边开始移除key值
  • lrange key start stop:返回指定长度的元素(lrange key 0 -1代表返回全部元素)
  • lrem key count value:根据count值移除列表key中于参数value相等的元素 (count>0:从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。count = 0 : 移除表中所有与 value 相等的值)
  • inedx key index:返回下标为index的元素
  • itrim key start stop:对一个列表进行截取,从start开始,stop结束

Set型

Set集合是一个无序不重复的队列,能够自动去重

  • sadd key member:将一个或多个member元素加入到set集合中,拥有自动去重功能
  • srem key member:移除集合中的一个或多个元素
  • smember key:返回集合key中的所有成员

🤣🤣🤣🤣🤣🤣🤣🤣🤣🤣🤣

Hash型

  • hset key name value:添加一个name和value键值对到key这个hash类型
  • hget key name:获取hash类型的name键对应的值
  • hmset 大key name1 小key name2 小key:添加多个name和key保存到大key中
  • hmget key name1 name2:批量获取hash类型的键对应的值
  • hkeys:返回哈希表 key 中的所有键
  • hvals:返回哈希表 key 中的所有的value值
  • hgetall:返回哈希表 key 中,所有的键和值

事务

在Redis中的事务是弱事务,失败并不会回滚,有点多余

  • multi:标记一个事务块的开始
  • exec:执行所有事务块内的命令
  • discard:取消事务,放弃执行事务块内的所有命令

订阅/广播

  • SUBSCRIBE channel [channel …]:订阅给定的一个或多个频道的信息。
  • PUBLISH channel message:将信息message发送到指定的频道channel

Java操作Redis

创建一个普通java项目

导包

配置连接池

新封装一个工具类,方便以后获取Jedis

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package com.ifueen.redis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
* 连接连接池的工具类
*/
public class JedisUtil {

private static JedisPool jedisPool = null;
static {
//创建JedisPool配置对象
JedisPoolConfig config = new JedisPoolConfig();

//配置
config.setMaxIdle(2);
config.setMaxTotal(10);
config.setMaxWaitMillis(1*3000); //创建连接超时
config.setTestOnBorrow(true);//获取连接是测试连接是否畅通

//配置jedisPool
jedisPool = new JedisPool(config,"127.0.0.1",6379,1*1000,"123456");
}

/**
* 返回jedis对象
* @return
*/
public static Jedis getJedis(){
return jedisPool.getResource();
}

/**
* 关闭连接池
*/
public static void close(){
jedisPool.destroy();
}

}

测试

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
package com.ifueen.redis;

import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.SortingParams;
import redis.clients.jedis.Transaction;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
* 测试jedis
*/
public class JedisTest {
//获取到jedis
Jedis jedis = JedisUtil.getJedis();
/**
* 测试String型
*/
@Test
public void testString(){

//设置单个String的健值
jedis.set("name","fueen");
String name = jedis.get("name");
System.out.println(name);

//给多个set赋值
jedis.mset("username","fueen","age","18","speak","山泥若");
List<String> mget = jedis.mget("username", "age", "speak");
mget.forEach(m->{
System.out.println(m);
});

//让key自增
Long age = jedis.incr("age");
System.out.println(age);
//自减多少
Long decrBy = jedis.decrBy("age", 5);
System.out.println(decrBy);
//关闭jedis
jedis.close();
JedisUtil.close();
}

/**
* 对Key的测试
*/
@Test
public void testKey() throws Exception {

//获取所有的key
Set<String> keys = jedis.keys("*");
System.out.println(keys);
//删除key
jedis.del("age1");
Set<String> keys1 = jedis.keys("*");
System.out.println(keys1);
//设置key的过期时间
jedis.expire("age",30);
//查看key的过期时间
Long age = jedis.ttl("age");
System.out.println(age);
//清空所有数据库的数据,直接清空整个redis
jedis.flushAll();
Set<String> keys2 = jedis.keys("*");
System.out.println(keys2);
//清空当前库
jedis.flushDB();
Set<String> keys3 = jedis.keys("*");
System.out.println(keys3);
//选择数据库
jedis.select(5);
jedis.close();
JedisUtil.close();
}

/**
* 对List集合的操作
*/
@Test
public void testList(){
//从左到右将值插到list中去
jedis.lpush("name","fueen","山泥若","电棍","落日飞车","李志");
//查询list集合中的值
List<String> name = jedis.lrange("name", 0, -1);
System.out.println(name);
//从右到左将值插到list中
jedis.rpush("speak","希望我们大家开心","你没事吧?兄弟",
"这打野的走位我就觉得你妈逼离谱","MyJnin","妈妈,他们抛弃了我");
List<String> name1 = jedis.lrange("speak", 0, -1);
System.out.println(name1);

//移除并返回列表 key 的头(最左边)元素
String name2 = jedis.lpop("name");
System.out.println(name2);
//移除并返回列表key的最右边元素
String speak = jedis.rpop("speak");
System.out.println(speak);
List<String> name3 = jedis.lrange("name", 0, -1);
System.out.println(name);
List<String> name4 = jedis.lrange("speak", 0, -1);
System.out.println(name4);
//根据count值(第二个参数)移除列表key中与参数 value(第三个参数) 相等的元素
jedis.lrem("name",0,"山泥若");
List<String> name5 = jedis.lrange("name", 0, -1);
System.out.println(name5);
//对一个列表进行修剪
jedis.ltrim("speak",0,2);
//排序
jedis.lpush("num","15","56","19","70");
System.out.println("原始值:"+jedis.lrange("num",0,-1));
System.out.println("排序后的值:"+jedis.sort("num"));
jedis.close();
JedisUtil.close();
}

/**
* 对Set集合进行操作
*/
@Test
public void testSet(){
//添加元素到set中
jedis.sadd("person","fueen","李志","万青","痛仰","窦唯");
//查看所有成员
Set<String> person = jedis.smembers("person");
System.out.println(person);
//删除
jedis.srem("person","痛仰");
//查看所有成员
Set<String> person1 = jedis.smembers("person");
System.out.println(person1);
//获得两个集合的交集
jedis.sadd("persons","fueen","这个世界会好吗","秦皇岛","再见杰克","高级动物");
Set<String> sinter = jedis.sinter("person", "persons");
System.out.println(sinter);
//将交集保存到一个新的集合中
jedis.sinterstore("personts","person","persons");
Set<String> person2 = jedis.smembers("personts");
System.out.println(person2);
//获取并集
Set<String> sunion = jedis.sunion("person", "persons");
System.out.println(sunion);
//将并集保存到一个新的set中
jedis.sunionstore("personc","person","persons");
Set<String> person3 = jedis.smembers("personc");
System.out.println(person3);
//差集
Set<String> sdiff = jedis.sdiff("person", "persons");
System.out.println(sdiff);
//将差集保存到新的set中
jedis.sdiffstore("persont","person","persons");
Set<String> person4 = jedis.smembers("personc");
System.out.println(person4);
jedis.close();
JedisUtil.close();
}

/**
* 对Hash的操作
*/
@Test
public void testHash(){
//设置值
jedis.hset("user", "name","向阳花");
//获取所有
Map<String, String> user = jedis.hgetAll("user");
System.out.println(user);
//删除
jedis.hdel("user","name");
jedis.hset("ccc","age","15");
//自增
jedis.hincrBy("ccc","age",2);
Map<String, String> ccc = jedis.hgetAll("ccc");
System.out.println(ccc);
//新增多个成员
jedis.hmget("user", "name","向阳花","age","20","speak","会不会害怕");
//查询所有的key
Set<String> user1 = jedis.hkeys("user");
System.out.println(user1);
//查询所有的value
List<String> user2 = jedis.hvals("user");
System.out.println(user2);
jedis.close();
JedisUtil.close();
}

/**
* 测试排序
*/
@Test
public void testJedis(){
jedis.lpush("num","15","56","19","70");
System.out.println("原始值:"+jedis.lrange("num",0,-1));
System.out.println("排序后的值:"+jedis.sort("num"));

SortingParams sortingParams = new SortingParams();
sortingParams.alpha();
System.out.println("排序后:"+jedis.sort("langues",sortingParams));
jedis.close();
JedisUtil.close();
}

/**
* 测试事务
*/
@Test
public void testTransation(){
jedis.set("name","fueen");
jedis.set("age","20");
System.out.println(jedis.mget("name","age"));
//开启事务
Transaction multi = jedis.multi();
//自增
multi.incr("name");
multi.incr("age");
//提交事务
List<Object> exec = multi.exec();
System.out.println(exec);
System.out.println(jedis.mget("name","age"));
jedis.close();
JedisUtil.close();
}


}
❤赏点钱让我买杯快乐水8❤