Jedis 操作 Redis6
2964字约10分钟
2024-08-10
pom.xml
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
Jedis-API:连接
public static void main(String[] args) {
// 创建 Jedis 对象
Jedis jedis = new Jedis("39.105.172.126", 6379);
// 测试
String result = jedis.ping();
// 注意:redis 配置文件需要注释 bind 和 protected-mode yes 改为 no,不然只能本机连接
// 如果是本机虚拟机,也有可能是因为防火墙没关闭
System.out.println(result); // PONG
// 关闭
jedis.close();
}
Jedis-API:key
@Test
public void testKey() {
// 1、new Jedis 对象即可
Jedis jedis = new Jedis("39.105.172.126", 6379);
System.out.println("清空数据:" + jedis.flushDB());
System.out.println("判断某个键是否存在:" + jedis.exists("username"));
System.out.println("新增<'username', 'yulecha'>的键值对:" + jedis.set("username", "yulecha"));
System.out.println("新增<'password','password'>的键值对:" + jedis.set("password", "password"));
System.out.println("系统中所有的键========================================");
Set<String> keys = jedis.keys("*");
System.out.println(keys);
System.out.println();
System.out.println("删除键password:" + jedis.del("password"));
System.out.println("判断password是否存在:" + jedis.exists("password"));
System.out.println("查看username所存储的值的类型:" + jedis.type("username"));
System.out.println("随机返回key控件的一个:" + jedis.randomKey());
System.out.println("重命名key:" + jedis.rename("username", "name"));
System.out.println("取出重命名的name:" + jedis.get("name"));
System.out.println("按索引查询:" + jedis.select(0));
System.out.println("删除当前选择数据库的所有key:" + jedis.flushDB());
System.out.println("返回方强数据库中key的数目:" + jedis.dbSize());
System.out.println("删除所有数据库中的所有key:" + jedis.flushAll());
}
// 清空数据:OK
// 判断某个键是否存在:false
// 新增<'username', 'yulecha'>的键值对:OK
// 新增<'password','password'>的键值对:OK
// 系统中所有的键========================================
// [password, username]
// 删除键password:1
// 判断password是否存在:false
// 查看username所存储的值的类型:string
// 随机返回key控件的一个:username
// 重命名key:OK
// 取出重命名的name:yulecha
// 按索引查询:OK
// 删除当前选择数据库的所有key:OK
// 返回方强数据库中key的数目:0
// 删除所有数据库中的所有key:OK
Jedis-API:String
@Test
public void testString() {
Jedis jedis = new Jedis("39.105.172.126", 6379);
jedis.flushDB();
System.out.println("================增加数据================");
System.out.println(jedis.set("key1", "value1"));
System.out.println(jedis.set("key2", "value2"));
System.out.println(jedis.set("key3", "value3"));
System.out.println("删除键key2:" + jedis.del("key2"));
System.out.println("获取键key2:" + jedis.get("key2"));
System.out.println("修改key1:" + jedis.set("key1", "value1Changed"));
System.out.println("获取key1的值:" + jedis.get("key1"));
System.out.println("在key3后面加入值:" + jedis.append("key3", "Append"));
System.out.println("key3的值:" + jedis.get("key3"));
System.out.println("增加多个键值对:" + jedis.mset("key01", "value01", "key02", "value02", "key03", "value03", "key04", "value04"));
System.out.println("获取多个键值对:" + jedis.mget("key01", "key02", "key03"));
System.out.println("删除多个键值对:" + jedis.del("key01", "key02"));
System.out.println("获取多个键值对:" + jedis.mget("key01", "key02", "key03"));
jedis.flushDB();
System.out.println("==============新增键值对防止覆盖原先值===========");
System.out.println(jedis.setnx("key1", "value1"));
System.out.println(jedis.setnx("key2", "value2"));
System.out.println(jedis.setnx("key2", "value2-new"));
System.out.println("获取key1的value:" + jedis.get("key1"));
System.out.println("获取key2的value:" + jedis.get("key2"));
System.out.println("==============新增键值对并设置有效时间===============");
System.out.println(jedis.setex("key3", 2, "value3"));
System.out.println("获取key3的value:" + jedis.get("key3"));
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("获取key3的value:" + jedis.get("key3"));
System.out.println("=================获取原值,更新为新值");
System.out.println(jedis.getSet("key2", "key2GetSet"));
System.out.println(jedis.get("key2"));
System.out.println("获得key2的值子字符:" + jedis.getrange("key2", 2, 4));
}
// ================增加数据================
// OK
// OK
// OK
// 删除键key2:1
// 获取键key2:null
// 修改key1:OK
// 获取key1的值:value1Changed
// 在key3后面加入值:12
// key3的值:value3Append
// 增加多个键值对:OK
// 获取多个键值对:[value01, value02, value03]
// 删除多个键值对:2
// 获取多个键值对:[null, null, value03]
// ==============新增键值对防止覆盖原先值===========
// 1
// 1
// 0
// 获取key1的value:value1
// 获取key2的value:value2
// ==============新增键值对并设置有效时间===============
// OK
// 获取key3的value:value3
// 获取key3的value:null
// =================获取原值,更新为新值
// value2
// key2GetSet
// 获得key2的值子字符:y2G
Jedis-API:List
@Test
public void testList() {
Jedis jedis = new Jedis("39.105.172.126", 6379);
jedis.flushDB();
System.out.println("=============添加一个list=============");
jedis.lpush("collections", "ArrayList", "Vector", "Stack", "HashMap", "WeakHashMap");
jedis.lpush("collections", "HashSet");
jedis.lpush("collections", "TreeSet");
jedis.lpush("collections", "TreeMap");
System.out.println("colletions的内容:" + jedis.lrange("colletions", 0 , -1));
System.out.println("colletions区间0-3的内容:" + jedis.lrange("colletions", 0 , 3));
System.out.println("======================================");
// 删除列表指定的值,第二个参数为删除的个数(有重复时),后 add 进去值先被删,类似于出栈
System.out.println("删除指定元素个数:" + jedis.lrem("collections", 2, "HashMap"));
System.out.println("collections的内容" + jedis.lrange("collections", 0, -1));
System.out.println("删除下标0-3区间之外的元素:" + jedis.ltrim("collections", 0 , 3));
System.out.println("collections的内容:" + jedis.lrange("collections", 0 , -1));
System.out.println("collections列表出栈(左端):" + jedis.lpop("collections"));
System.out.println("collections的内容:" + jedis.lrange("collections", 0, -1));
System.out.println("collections添加元素,从列表右端,与lpush相对应:" + jedis.rpush("collections", "ArrayList", "Vector", "Stack", "HashMap", "WeakHashMap"));
System.out.println("collections的内容:" + jedis.lrange("collections", 0, -1));
System.out.println("collections列表出栈(左端):" + jedis.rpop("collections"));
System.out.println("collections的内容:" + jedis.lrange("collections", 0, -1));
System.out.println("修改collections指定下标1的内容" + jedis.lset("collections", 1, "LinkList"));
System.out.println("collections的内容:" + jedis.lrange("collections", 0, -1));
System.out.println("=======================================");
System.out.println("collections的长度:" + jedis.llen("collections"));
System.out.println("获取collections下标为2的元素:" + jedis.lindex("collections", 2));
System.out.println("=======================================");
jedis.lpush("sortedList", "3", "6", "2", "0", "7", "4");
System.out.println("sortedList排序前:" + jedis.lrange("sortedList", 0, -1));
System.out.println(jedis.sort("sortedList"));
System.out.println("sortedList排序后:" + jedis.lrange("sortedList", 0, -1));
}
// =============添加一个list=============
// colletions的内容:[]
// colletions区间0-3的内容:[]
// ======================================
// 删除指定元素个数:1
// collections的内容[TreeMap, TreeSet, HashSet, WeakHashMap, Stack, Vector, ArrayList]
// 删除下标0-3区间之外的元素:OK
// collections的内容:[TreeMap, TreeSet, HashSet, WeakHashMap]
// collections列表出栈(左端):TreeMap
// collections的内容:[TreeSet, HashSet, WeakHashMap]
// collections添加元素,从列表右端,与lpush相对应:8
// collections的内容:[TreeSet, HashSet, WeakHashMap, ArrayList, Vector, Stack, HashMap, WeakHashMap]
// collections列表出栈(左端):WeakHashMap
// collections的内容:[TreeSet, HashSet, WeakHashMap, ArrayList, Vector, Stack, HashMap]
// 修改collections指定下标1的内容OK
// collections的内容:[TreeSet, LinkList, WeakHashMap, ArrayList, Vector, Stack, HashMap]
// =======================================
// collections的长度:7
// 获取collections下标为2的元素:WeakHashMap
// =======================================
// sortedList排序前:[4, 7, 0, 2, 6, 3]
// [0, 2, 3, 4, 6, 7]
// sortedList排序后:[4, 7, 0, 2, 6, 3]
Jedis-API:Set
@Test
public void testSet() {
// 1、new Jedis 对象即可
Jedis jedis = new Jedis("39.105.172.126", 6379);
jedis.flushDB();
System.out.println("=============向集合中添加元素(不重复)==================");
System.out.println(jedis.sadd("eleSet", "e1", "e2", "e4", "e3", "e0", "e8", "e7", "e5"));
System.out.println(jedis.sadd("eleSet", "e6"));
System.out.println(jedis.sadd("eleSet", "e6"));
System.out.println("eleSet的所有元素为:" + jedis.smembers("eleSet"));
System.out.println("删除一个元素e0:" + jedis.srem("eleSet", "e0"));
System.out.println("eleSet的所有元素为:" + jedis.smembers("eleSet"));
System.out.println("删除两个元素e7和e6:" + jedis.srem("eleSet", "e7", "e6"));
System.out.println("eleSet的所有元素为:" + jedis.smembers("eleSet"));
System.out.println("随机移除集合中的一个元素:" + jedis.spop("eleSet"));
System.out.println("随机移除集合中的一个元素:" + jedis.spop("eleSet"));
System.out.println("eleSet的所有元素为:" + jedis.smembers("eleSet"));
System.out.println("eleSet中包含的元素的个数:" + jedis.scard("eleSet"));
System.out.println("e3是否在eleSet中:" + jedis.sismember("eleSet", "e3"));
System.out.println("e1是否在eleSet中:" + jedis.sismember("eleSet", "e1"));
System.out.println("e5是否在eleSet中:" + jedis.sismember("eleSet", "e5"));
System.out.println("================================");
System.out.println(jedis.sadd("eleSet1", "e1", "e2", "e4", "e3", "e0", "e8", "e7", "e5"));
System.out.println(jedis.sadd("eleSet2", "e1", "e2", "e4", "e3", "e0", "e8"));
System.out.println("将eleSet1中删除e1并存入eleSet3中:" + jedis.smove("eleSet1", "eleSet3", "e1"));
System.out.println("将eleSet1中删除e2并存入eleSet3中:" + jedis.smove("eleSet1", "eleSet3", "e2"));
System.out.println("eleSet1中的元素:" + jedis.smembers("eleSet1"));
System.out.println("eleSet3中的元素:" + jedis.smembers("eleSet3"));
System.out.println("=====================集合运算============================");
System.out.println("eleSet1中的元素:" + jedis.smembers("eleSet1"));
System.out.println("eleSet2中的元素:" + jedis.smembers("eleSet2"));
System.out.println("eleSet1和eleSet2的交集:" + jedis.sinter("eleSet1", "eleSet2"));
System.out.println("eleSet1和eleSet2的并集:" + jedis.sunion("eleSet1", "eleSet2"));
System.out.println("eleSet1和eleSet2的差集:" + jedis.sdiff("eleSet1", "eleSet2"));
// 求交集并将交集保存到 dstkey 的集合
jedis.sinterstore("eleSet4", "eleSet1", "eleSet2");
System.out.println("eleSet4中的元素:" + jedis.smembers("eleSet4"));
}
// =============向集合中添加元素(不重复)==================
// 8
// 1
// 0
// eleSet的所有元素为:[e4, e5, e7, e1, e2, e3, e0, e8, e6]
// 删除一个元素e0:1
// eleSet的所有元素为:[e5, e7, e1, e2, e3, e4, e8, e6]
// 删除两个元素e7和e6:2
// eleSet的所有元素为:[e2, e3, e4, e1, e8, e5]
// 随机移除集合中的一个元素:e8
// 随机移除集合中的一个元素:e1
// eleSet的所有元素为:[e4, e2, e5, e3]
// eleSet中包含的元素的个数:4
// e3是否在eleSet中:true
// e1是否在eleSet中:false
// e5是否在eleSet中:true
// ================================
// 8
// 6
// 将eleSet1中删除e1并存入eleSet3中:1
// 将eleSet1中删除e2并存入eleSet3中:1
// eleSet1中的元素:[e8, e0, e4, e5, e7, e3]
// eleSet3中的元素:[e1, e2]
// =====================集合运算============================
// eleSet1中的元素:[e8, e0, e4, e5, e7, e3]
// eleSet2中的元素:[e3, e2, e8, e0, e4, e1]
// eleSet1和eleSet2的交集:[e8, e0, e4, e3]
// eleSet1和eleSet2的并集:[e8, e0, e4, e5, e7, e1, e2, e3]
// eleSet1和eleSet2的差集:[e7, e5]
// eleSet4中的元素:[e0, e8, e4, e3]
Jedis-API:ZSet
@Test
public void testZSet() {
// 创建 Jedis 对象
Jedis jedis = new Jedis("39.105.172.126", 6379);
jedis.flushAll();
jedis.zadd("chengdu", 100, "jinjiangqu");
Set<String> value = jedis.zrange("chengdu", 0, -1);
System.out.println(value);
// 关闭
jedis.close();
}
Jedis-API:Hash
@Test
public void testHash() {
Jedis jedis = new Jedis("39.105.172.126", 6379);
jedis.flushDB();
Map<String, String> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
map.put("key4", "value4");
jedis.hmset("hash", map);
jedis.hset("hash", "key5", "value5");
System.out.println("散列hash的所有键值对为:" + jedis.hgetAll("hash"));
System.out.println("散列hash的所有键为:" + jedis.hkeys("hash"));
System.out.println("散列hash的所有值为:" + jedis.hvals("hash"));
System.out.println("将key6保存的值加上一个整数,如果key6不存在则添加key6" + jedis);
System.out.println("散列hash的所有键值对为:" + jedis.hgetAll("hash"));
System.out.println("将key6保存的值加上一个整数,如果key6不存在则添加key6" + jedis);
System.out.println("散列hash的所有键值对为:" + jedis.hgetAll("hash"));
System.out.println("删除一个或者多个键值对:" + jedis.hdel("hash", "key2", "key3"));
System.out.println("散列hash的所有键值对为:" + jedis.hgetAll("hash"));
System.out.println("散列hash中键值对的个数:" + jedis.hlen("hash"));
System.out.println("判断hash中是否存在key2:" + jedis.hexists("hash", "key2"));
System.out.println("判断hash中是否存在key3:" + jedis.hexists("hash", "key3"));
System.out.println("获取hash中的值" + jedis.hmget("hash", "key3"));
System.out.println("获取hash中的值" + jedis.hmget("hash", "key3", "key4"));
}
// 散列hash的所有键值对为:{key1=value1, key2=value2, key5=value5, key3=value3, key4=value4}
// 散列hash的所有键为:[key1, key2, key5, key3, key4]
// 散列hash的所有值为:[value4, value1, value2, value3, value5]
// 将key6保存的值加上一个整数,如果key6不存在则添加key6redis.clients.jedis.Jedis@3feba861
// 散列hash的所有键值对为:{key1=value1, key2=value2, key5=value5, key3=value3, key4=value4}
// 将key6保存的值加上一个整数,如果key6不存在则添加key6redis.clients.jedis.Jedis@3feba861
// 散列hash的所有键值对为:{key1=value1, key2=value2, key5=value5, key3=value3, key4=value4}
// 删除一个或者多个键值对:2
// 散列hash的所有键值对为:{key1=value1, key5=value5, key4=value4}
// 散列hash中键值对的个数:3
// 判断hash中是否存在key2:false
// 判断hash中是否存在key3:false
// 获取hash中的值[null]
// 获取hash中的值[null, value4]
栗子-短信验证码
1、输入手机号,获取随机生成的 6 位数字验证码,2 分钟有效
2、输入验证码,点击验证,返回成功或失败
3、每个手机号每天只能获取 3 次验证码
// 连接 redis
public static Jedis jedis = new Jedis("39.105.172.126", 6379);
public static void main(String[] args) {
String phone = "13576735261";
// 获取生成的验证码
String code = getCode(phone);
System.out.println("生成的验证码:" + code);
// 获取输入的验证码
System.out.print("请输入您的手机验证码:");
Scanner scanner = new Scanner(System.in);
String inCode = scanner.nextLine();
// 校验验证码
verifyCode(phone, inCode);
}
/**
* 验证码放到 redis,设置过期时间,验证每个手机号只能发送三次
* @param phone
* @return
*/
public static String getCode(String phone) {
// 手机发送次数 key
String countKey = "VerifyCode" + phone + ":count";
// 验证码 key
String codeKey = "VerifyCode" + phone + ":code";
// 获取该手机号已经获取了几次验证
String count = jedis.get(countKey);
if (count == null) {
// count 为 null 说明是第一次获取验证码
jedis.setex(countKey, 24*60*60, "1");
} else if (Integer.parseInt(count) <= 2) {
// 不是第一次获取,且没超过 3 次的限制,获取验证码次数 +1
jedis.incr(countKey);
} else {
System.out.println("今天发送次数已经超过三次");
return null;
}
// 发送的验证码放到 redis
String code = generateCode();
// 设置 120 秒过期时间
jedis.setex(codeKey, 120, code);
return code;
}
/**
* 生成 6 位数字验证码
* @return
*/
public static String generateCode() {
StringBuilder str = new StringBuilder();
Random random = new Random();
// 循环生成 6 次随机数
for (int i = 0; i < 6; i++) {
// 生成 0 到 10 的随机数
str.append(random.nextInt(10));
}
return str.toString();
}
/**
* 验证码校验
* @param phone
* @param code
*/
public static void verifyCode(String phone, String code) {
// 验证码 key
String codeKey = "VerifyCode" + phone + ":code";
// 获取 redis 中的验证码
String value = jedis.get(codeKey);
if (value == null) {
System.out.println("验证码超时");
}
if (!code.equals(value)) {
System.out.println("验证码输入错误");
return;
}
System.out.println("验证码输入正确");
}