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
public void demo(){
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(“*”) 对应 keys *命令:查询所有的key
- jedis.exists(“k1”) 对应exists key命令:判断某个key是否存在
- jedis.ttl(“k1”) 对应 ttl key命令:查看还有多少秒过期
- 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”) 对应set key value命令:添加值
- jedis.get(“k1”) 对应 get key命令:获取key对应的键值
- …
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分钟有效
- 2、输入验证码,点击验证,返回成功或失败
- 3、每个手机号每天只能输入3次
梳理设计思路:
- 随机生成六位的数字验证码。可以使用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();
}
}
本文含有隐藏内容,请 开通VIP 后查看