使用java操作Redis的中间件(JAR),Jedis是Redis官方推荐的java连接工具。
连接测试
创建Maven项目,添加相关依赖:
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
</dependency>
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
创建一个测试类,通过redis的ping
命令测试是否连接成功
public class Ping {
public static void main(String[] args) {
String host = "111.111.111.111";
int port = 6379;
Jedis jedis = new Jedis(host, port);
System.out.println(jedis.ping());
}
}
注意:如果使用阿里云服务器搭建Redis,需要额外做两个操作,不然会报错
设置阿里云ECS安全组,登录阿里云账户点击ECS实例,找到安全组,快速添加一个Redis,百度有很多
Redis本身配置文件也需要修改两个地方:1、注释掉bind 2、protected-mode修改为no,具体可参考:https://blog.csdn.net/zihonggege/article/details/106109359
常用API
这一节可以参考:
对键的通用操作
方法 | 描述 | 返回值/说明 |
---|---|---|
jedis.flush | ||
jedis.flushDB | 清空数据 | |
boolean jedis.exists(String key) | 判断某个键是否存在 | true = 存在,false= 不存在 |
jedis.set(String key,String value) | 新增键值对(key,value) | 返回String类型的OK代表成功 |
Set<String> jedis.keys(*) | 获取所有key | 返回set 无序集合 |
jedis.del(String key) | 删除键为key的数据项 | |
jedis.expire(String key,int i) | 设置键为key的过期时间为i秒 | |
int jedis.ttl(String key) | 获取建委key数据项的剩余时间(秒) | |
jedis.persist(String key) | 移除键为key属性项的生存时间限制 | |
jedis.type(String key) | 查看键为key所对应value的数据类型 |
对字符串的操作
语法 | 描述 |
---|---|
jedis.set(String key,String value) | 增加(或覆盖)数据项 |
jedis.setnx(String key,String value) | 不覆盖增加数据项(重复的不插入) |
jedis.setex(String ,int t,String value) | 增加数据项并设置有效时间 |
jedis.del(String key) | 删除键为key的数据项 |
jedis.get(String key) | 获取键为key对应的value |
jedis.append(String key, String s) | 在key对应value 后边扩展字符串 s |
jedis.mset(String k1,String V1,String K2,String V2,…) | 增加多个键值对 |
String[] jedis.mget(String K1,String K2,…) | 获取多个key对应的value |
jedis.del(new String[](String K1,String K2,… )) | 删除多个key对应的数据项 |
String jedis.getSet(String key,String value) | 获取key对应value并更新value |
String jedis.getrang(String key , int i, int j) | 获取key对应value第i到j字符 ,从0开始,包头包尾 |
对整数和浮点数操作
语法 | 描述 |
---|---|
jedis.incr(String key) | 将key对应的value 加1 |
jedis.incrBy(String key,int n) | 将key对应的value 加 n |
jedis.decr(String key) | 将key对应的value 减1 |
jedis.decrBy(String key , int n) | 将key对应的value 减 n |
对列表(List)的操作
语法 | 描述 |
---|---|
jedis.lpush(String key, String v1, String v2,…) | 添加一个List , 注意:如果已经有该List对应的key, 则按顺序在左边追加 一个或多个 |
jedis.rpush(String key , String vn) | key对应list右边插入元素 |
jedis.lrange(String key,int i,int j) | 获取key对应list区间[i,j]的元素,注:从左边0开始,包头包尾 |
jedis.lrem(String key,int n , String val) | 删除list中 n个元素val |
jedis.ltrim(String key,int i,int j) | 删除list区间[i,j] 之外的元素 |
jedis.lpop(String key) | key对应list ,左弹出栈一个元素 |
jedis.rpop(String key) | key对应list ,右弹出栈一个元素 |
jedis.lset(String key,int index,String val) | 修改key对应的list指定下标index的元素 |
jedis.llen(String key) | 获取key对应list的长度 |
jedis.lindex(String key,int index) | 获取key对应list下标为index的元素 |
jedis.sort(String key) | 把key对应list里边的元素从小到大排序 |
对集合(Set)的操作
语法 | 操作 |
---|---|
jedis.sadd(String key,String v1,String v2,…) | 添加一个set |
jedis.smenbers(String key) | 获取key对应set的所有元素 |
jedis.srem(String key,String val) | 删除集合key中值为val的元素 |
jedis.srem(String key, Sting v1, String v2,…) | 删除值为v1, v2 , …的元素 |
jedis.spop(String key) | 随机弹出栈set里的一个元素 |
jedis.scared(String key) | 获取set元素个数 |
jedis.smove(String key1, String key2, String val) | 将元素val从集合key1中移到key2中 |
jedis.sinter(String key1, String key2) | 获取集合key1和集合key2的交集 |
jedis.sunion(String key1, String key2) | 获取集合key1和集合key2的并集 |
jedis.sdiff(String key1, String key2) | 获取集合key1和集合key2的差集 |
对有序集合(Zset)的操作
语法 | 描述 |
---|---|
jedis.zadd(String key,Map map) | 添加一个ZSet |
jedis.hset(String key,int score , int val) | 往 ZSet插入一个元素(Score-Val) |
jedis.zrange(String key, int i , int j) | 获取ZSet 里下表[i,j] 区间元素Val |
jedis. zrangeWithScore(String key,int i , int j) | 获取ZSet 里下表[i,j] 区间元素Score - Val |
jedis.zrangeByScore(String , int i , int j) | 获取ZSet里score[i,j]分数区间的元素(Score-Val) |
jeids.zscore(String key,String value) | 获取ZSet里value元素的Score |
jedis.zrank(String key,String value) | 获取ZSet里value元素的score的排名 |
jedis.zrem(String key,String value) | 删除ZSet里的value元素 |
jedis.zcard(String key) | 获取ZSet的元素个数 |
jedis.zcount(String key , int i ,int j) | 获取ZSet总score在[i,j]区间的元素个数 |
jedis.zincrby(String key,int n , String value) | 把ZSet中value元素的score+=n |
对哈希(Hash)的操作
语法 | 描述 |
---|---|
jedis.hmset(String key,Map map) | 添加一个Hash |
jedis.hset(String key , String key, String value) | 向Hash中插入一个元素(K-V) |
jedis.hgetAll(String key) | 获取Hash的所有(K-V) 元素 |
jedis.hkeys(String key) | 获取Hash所有元素的key |
jedis.hvals(String key) | 获取Hash所有元素 的value |
jedis.hincrBy(String key , String k, int i) | 把Hash中对应的k元素的值 val+=i |
jedis.hdecrBy(String key,String k, int i) | 把Hash中对应的k元素的值 val-=i |
jedis.hdel(String key , String k1, String k2,…) | 从Hash中删除一个或多个元素 |
jedis.hlen(String key) | 获取Hash中元素的个数 |
jedis.hexists(String key,String K1) | 判断Hash中是否存在K1对应的元素 |
jedis.hmget(String key,String K1,String K2) | 获取Hash中一个或多个元素value |
排序操作
使用排序, 首先需要生成一个排序对象
SortingParams sp = new SortingParams(); List<String> sortList = jedis.sort("list", sp.desc());
这里得到的sortList是一个排好序的新对象,数据库中的list并未改变
语法 | 描述 |
---|---|
jedis.sort(String key,sortingParams.alpha()) | 队列按首字母a-z 排序 |
jedis.sort(String key, sortingParams.asc() ) | 队列按数字升序排列 |
jedis.sort(String key , sortingParams.desc()) | 队列按数字降序排列 |
事务操作
public static void main(String[] args) {
Jedis jedis = JedisUtil.connect();
JSONObject obj = new JSONObject();
obj.put("username", "张三");
obj.put("age", 18);
obj.put("sex", "男");
String user = obj.toJSONString();
Transaction multi = jedis.multi(); // 开启事务
// jedis.watch(user); 添加监控 乐观锁
try {
multi.set("user:1", user);
int i = 1/0;
multi.exec(); // 提交事务
} catch (Exception e) {
multi.discard(); // 放弃事务
// jedis.unwatch(); // 手动关闭监控
e.printStackTrace();
} finally {
System.out.println(jedis.get("user:1"));
jedis.close(); // 关闭连接
}
}
正常提交事物后需要关闭连接
如果出现异常『开放 int i = 1/0;』,事务将不能被执行,我们需要手动的放弃事务