Redis学习笔记(三)
1,Jedis是什么
Jedis是Redis的一个客户端工具,Jedis即用Java操作Redis。
(类比,概念JDBC是使用Java操作数据库)
2,Jedis的必要配置和简单演示
①创建一个maven工程,导入Jedis相关依赖
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.3.0</version> </dependency>
②创建包和类进行测试
public static void main(String[] args) { //创建Jedis对象进行连接,若使用两个参数的构造器,则第一个参数是主机ip,第二个参数是端口号 Jedis jedis = new Jedis("47.116.4.200",6379); //可以测试是否连接成功 jedis.auth("******"); //如果你的redis设置了密码,需要调用auth方法进行授权 String value = jedis.ping(); System.out.println(value); //Redis中如果能够ping通,会返回一个pong jedis.close(); }
可能存在的问题:
为了保证以上程序可以正常运行,需要提前在服务器上的redis目录中的redis.conf文件进行修改。如下图:
修改完成后,重启redis服务。
service redis restart 重启redis服务
然后需要继续进行修改:
- 如果使用虚拟机做服务器,可以先通过 systemctl status firewalld命令查看防火墙状态,如果防火墙是打开状态,需要使用systemctl stop firewalld命令对其进行临时关闭。
- 如果使用了云服务器配合宝塔面板,需要先配置redis(默认端口为3306)的安全组,然后在宝塔面板的安全模块中放行redis端口号。如下图:


配置完成后,再次运行程序即可成功。
3,测试相关数据类型
我们之前在shell里面使用命令行操作Redis的命令,在java程序中都能用相应的同名方法等进行操作。
3.1,Jedis操作key
演示:获取所有的key(对应命令:keys *)
@Test publicvoiddemo(){ Jedis jedis = new Jedis("47.116.4.200",6379); //创建Redis连接 jedis.auth("******"); //如果redis设置了密码,需要使用auth方法进行授权 //添加值 jedis.set("name","luccy"); //获取值 String name = jedis.get("name"); System.out.println(name); //返回name对应的value值:luccy jedis.ttl("name"); System.out.println(name1); //没有设置过期时间,返回-1则说明永不过期 Set<String> keys = jedis.keys("*"); //得到Redis中所有的key。返回set集合 //遍历显示Set集合 for(String key:keys){ System.out.println(key); //此时有一个key(即name) } jedis.close(); }
有很多方法和命令一一对应,如:
- jedis.keys(“*”)
- jedis.exists(“k1”) 对应exists key命令:判断某个key是否存在
- jedis.ttl(“k1”)
- jedis.expire(String key,int second) 对应 expire key second命令:设置指定key的过期时间
3.2,Jedis操作字符串(string)
演示:mset同时设置一个或多个键值对,mget同时获取一个或多个value
@Test public void demo(){ Jedis jedis = new Jedis("47.116.4.200",6379); //创建Redis连接 jedis.auth("******"); //如果redis设置了密码,需要使用auth方法进行授权 jedis.mset("k1","v1","k2","v2"); //此处同时设置了两对key-value List<String> mget = jedis.mget("k1", "k2"); System.out.println(mget); //输出此集合 jedis.close(); }
- jedis.set(“k1”, “v1”)
- jedis.get(“k1”)
3.3,Jedis操作列表(list)
注:list单键多值
演示:rpush从右边添加
@Test public void demo(){ Jedis jedis = new Jedis("47.116.4.200",6379); //创建Redis连接 jedis.auth("******"); //如果redis设置了密码,需要使用auth方法进行授权 jedis.rpush("key1","lucy","marry","jack"); //从右添加 List<String> values = jedis.lrange("key1", 0, -1);//0到-1表示把所有值都取出来。返回list集合 System.out.println(values);在 jedis.close(); }
3.4,Jedis操作集合(set)
注:set集合中元素不可以重复
演示:set集合的添加数据(sadd),查看数据(smembers),删除数据(srem)
@Test public void demo(){ Jedis jedis = new Jedis("47.116.4.200",6379); //创建Redis连接 jedis.auth("******"); //如果redis设置了密码,需要使用auth方法进行授权 jedis.sadd("class","jack","Tom","Green"); //添加 jedis.srem("class","Green"); //删除 Set<String> aClass = jedis.smembers("class"); //查询 System.out.println(aClass); jedis.close(); }
3.5,Jedis操作哈希(hash)
演示:hash的添加(hset)和查询(hget)
@Test public void demo(){ Jedis jedis = new Jedis("47.116.4.200",6379); //创建Redis连接 jedis.auth("******"); //如果redis设置了密码,需要使用auth方法进行授权 jedis.hset("users","age","20"); //添加 String hget = jedis.hget("users", "age"); //查询 System.out.println(hget); jedis.close(); }
3.6,Jedis操作zset
演示zset的添加元素操作(zadd)
@Test public void demo(){ Jedis jedis = new Jedis("47.116.4.200",6379); //创建Redis连接 jedis.auth("******"); //如果redis设置了密码,需要使用auth方法进行授权 jedis.zadd("language",100d,"java"); //此处的第二个参数100为double类型。java的score为100.0 Set<String> language = jedis.zrange("language", 0, -1); System.out.println(language); jedis.close(); }
4,Jedis应用案列:模拟验证码功能
通过案例进一步感受Jedis相关操作
完成一个手机验证码功能 要求:
- 1、输入手机号,点击发送后随机生成6位数字码,2分钟有效
梳理设计思路:
- 随机生成六位的数字验证码。可以使用Java中的Random类
- 两分钟之内有效。可以把验证码放到Redis中去,同时设置过期时间(expire)
- 判断验证码是否匹配。从Redis中取出验证码判断和输入的是与否一致即可
- 每个手机号,每天只能输入三次。可以使用incrby操作每次发送之后计数值加一,计数值等于3的时候,就不可以再发送。
代码实现:
public class PhoneCode { public static void main(String[] args) { //模拟发送验证码的功能 verifyCode("15610109385"); getRedisCode("15610109385","932924"); //redis中的验证码和输入的验证码(932924)进行对比 } //方法一:随机生成六位验证码的方法 public static String getCode(){ Random random = new Random(); String code=""; for(int i=0;i<6;i++){ int rand = random.nextInt(10);//表示生成10以内的值 code+=rand; } return code; } //方法二:让每个手机号每天只能发送三次;验证码放到Redis中;设置过期时间 public static void verifyCode(String phone){ Jedis jedis = new Jedis("47.116.4.200",6379); //连接Redis jedis.auth("******"); //如果redis设置了密码,需要使用auth方法进行授权 //可以把手机号的发送次数放到一个key中(countKey);验证码放到另外一个key(codeKey)中 //拼接key String countKey="VerifyCode"+phone+":count"; String codeKey="VerifyCode"+phone+":code"; //每个手机每天只能发送三次,count用于计数 String count = jedis.get("countKey"); if (count==null){ //key为空,说明一次也没有发送过。 //setex:可以在设置键值的同时,设置过期时间 jedis.setex(countKey,24*60*60,"1"); //第二个参数表示一天后过期。第三个参数说明是第一次发送消息 }else if(Integer.parseInt(count)<=2){ //注意count为String类型,需要转为integer或int类型。此为第二次或第三次发送 jedis.incr(countKey); //发送次数加一 }else if(Integer.parseInt(count)>2){ //已经发送了三次,不再进行发送 System.out.println("今天的发送次数已经用完了!!!"); jedis.close(); return; //此处加上return,如果发送超过三次。验证码不发送,且不再存入Redis,否则发送到验证码还会存到Redis } //发送的验证码需要放到Redis中去 String vcode = getCode(); jedis.setex(codeKey,120,vcode); //120s(2分钟)为过期时间,vcode为value值 jedis.close(); } //方法三:验证码的校验功能 public static void getRedisCode(String phone,String code){ //第二个参数code代表用户输入的验证码 //先从redis中获取验证码 Jedis jedis = new Jedis("47.116.4.200",6379); //连接Redis jedis.auth("******"); //如果redis设置了密码,需要使用auth方法进行授权 String codeKey="VerifyCode"+phone+":count"; String redisCode = jedis.get(codeKey); //得到Redis中的验证码 if (redisCode.equals(code)){ System.out.println("校验成功"); }else{ System.out.println("校验失败"); } jedis.close(); }}