一)Java连接Redis准备
第一步:需安装Redis服务和Java Redis驱动包。
Java Redis驱动包下载地址:https://mvnrepository.com/artifact/redis.clients/jedis
第二步:创建一个Maven项目,并在pom.xml文件中引入jedis驱动包。
pom.xml:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
</dependency>
二)连接Redis
方式一:默认连接"localhost"和"6379"端口
Jedis def1 = new Jedis();
方式二:指定连接host, 默认连接6379端口
Jedis def2 = new Jedis("localhost");
方式三:指定连接host和port
Jedis def3 = new Jedis("localhost", 6379);
方式四:通过HostAndPort类指定host和port
HostAndPort hap = new HostAndPort("localhost", 6379);
Jedis def4 = new Jedis(hap);
其它方式可见redis.clients.jedis.Jedis中的源码。
package com.oysept.redis;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
public class RedisConnection {
public static void main(String[] args) {
// 方式一: 默认连接"localhost"和"6379"端口
Jedis def1 = new Jedis();
System.out.println("ping redis连接,应返回PONG, 实际返回值: " + def1.ping());
// 方式二: 指定连接host, 默认连接6379端口
Jedis def2 = new Jedis("localhost");
// 方式三: 指定连接host和port
Jedis def3 = new Jedis("localhost", 6379);
// 方式四: 通过HostAndPort类指定host和port
HostAndPort hap = new HostAndPort("localhost", 6379);
Jedis def4 = new Jedis(hap);
}
}
三)String数据类型
实例:
package com.oysept.redis;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.params.SetParams;
public class RedisStringCache {
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost", 6379);
// 设置一个字符串, 如果key存在, 覆盖value, 如果key不存在, 新创建一个key value
// Redis命令: set key value
jedis.set("myStr", "111");
System.out.println("set: " + jedis.get("myStr"));
// 设置一个字符串, 当key存在时, 设置失败, 不存在时, 设置成功
// Redis命令: set key value nx
jedis.setnx("myStr", "222");
System.out.println("setnx: " + jedis.get("myStr"));
// 设置一个字符串, 并设置过期时间, 时间单位秒
// Redis命令: set key value [EX seconds]
jedis.setex("myStr", 60, "333");
System.out.println("setex: " + jedis.get("myStr") + ", 还有" + jedis.ttl("myStr") + "秒过期!");
// 设置一个字符串, 指定可选的参数
// Redis命令: set key value [EX seconds] [PX milliseconds] [NX|XX]
SetParams params = SetParams.setParams();
params.ex(600); // 秒
params.xx(); // 强制覆盖
jedis.set("myStr", "444", params);
System.out.println("set SetParams: " + jedis.get("myStr") + ", 还有" + jedis.ttl("myStr") + "秒过期!");
// 一次性设置多个字符串
// Redis命令: mset key value [key value ...]
// mget key [key ...]
jedis.mset("key1", "value1", "key2", "value2");
System.out.println("mset: " + jedis.mget("key1", "key2"));
// 查询key是否存在
// Redis命令: exists key [key ...]
boolean isExists = jedis.exists("myStr");
// 给字符串重命名, 当key不存在时, 会报错
// Redis命令: rename key newkey
// renamenx key newkey
jedis.rename("myStr", "newStr");
jedis.renamenx("newStr", "aaabbb");
// 设置一个number的元素, 然后再进行累计1
jedis.set("myNum", "66");
jedis.incr("myNum");
System.out.println("incr: " + jedis.get("myNum"));
}
}
效果图:
四)List链表数据类型
实例:
package com.oysept.redis;
import redis.clients.jedis.Jedis;
public class RedisListCache {
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost", 6379);
// 删除指定的key, 相当于把整个key在Redis中删除了
// Redis命令: del key [key ...]
jedis.del("myList");
// 设置一个列表, 往列表头部添加元素
// Redis命令: lpush key value [value ...]
jedis.lpush("myList", "111", "222", "333");
System.out.println("lpush: " + jedis.lrange("myList", 0, -1));
// 设置一个列表, 往列表尾部添加元素
// Redis命令: rpush key value [value ...]
jedis.rpush("myList", "AAA", "BBB", "CCC");
System.out.println("rpush: " + jedis.lrange("myList", 0, -1));
// 列表长度
// Redis命令: llen key
jedis.llen("myList");
// 指定获取列表区间范围的元素, 其它元素都抛弃掉
// Redis命令: ltrim key start stop
jedis.ltrim("myList", 3, 5);
System.out.println("ltrim: " + jedis.lrange("myList", 0, -1));
// 重新设置, 指定列表下标的value
// Redis命令: lset key index value
jedis.lset("myList", 1, "DDD");
System.out.println("lset: " + jedis.lrange("myList", 0, -1));
// 删除指定列表下标的value, 如value不一致, 删除失败
// Redis命令: lrem key count value
jedis.lrem("myList", 1, "DDD");
System.out.println("lrem: " + jedis.lrange("myList", 0, -1));
// 从列表头部弹出元素
// Redis命令: lpop key
jedis.lpop("myList");
System.out.println("lpop: " + jedis.lrange("myList", 0, -1));
// 从列表尾部弹出元素
// Redis命令: rpop key
jedis.rpop("myList");
System.out.println("rpop: " + jedis.lrange("myList", 0, -1));
}
}
效果图:
五)Hash数据类型
实例:
package com.oysept.redis;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import redis.clients.jedis.Jedis;
public class RedisHashCache {
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost", 6379);
// 删除指定的key, 相当于把整个key在Redis中删除了
// Redis命令: del key [key ...]
jedis.del("myHash");
// 设置一个Hash
// Redis命令: hset key field value
// hget key field
jedis.hset("myHash", "key1", "value1");
System.out.println("hset: " + jedis.hget("myHash", "key1"));
// 该方式只能添加一个key value, 当多个key value时, 会报错。原因是hset方法实现问题, hset命令不支持一次性插入多个key value
final Map<String, String> hset = new HashMap<String, String>();
hset.put("k1", "v1");
jedis.hset("myHash", hset);
System.out.println("hgetAll: " + jedis.hgetAll("myHash"));
// 一次性设置多个Hash, 当key存在时, 覆盖value
// Redis命令: hmset key field value [field value ...]
// hmget key field [field ...]
final Map<String, String> hmset = new HashMap<String, String>();
hmset.put("k1", "vvv111");
hmset.put("k2", "v2");
hmset.put("k3", "v3");
jedis.hmset("myHash", hmset);
System.out.println("hmset: " + jedis.hgetAll("myHash"));
// 判断key中, 某一个字段是否存在
// Redis命令: hexists key field
boolean isHexists = jedis.hexists("myHash", "k1");
System.out.println("hexists: " + isHexists);
// 列表长度
// Redis命令: hlen key
Long hlen = jedis.hlen("myHash");
System.out.println("hlen: " + hlen);
// 删除指定列表下标的value, 如value不一致, 删除失败
// Redis命令: hdel key field [field ...]
jedis.hdel("myHash", "k1", "k3");
System.out.println("hdel: " + jedis.hgetAll("myHash"));
// 获取Hash中所有的key
// Redis命令: hkeys key
Set<String> hkeys = jedis.hkeys("myHash");
System.out.println("hkeys: " + hkeys);
// 获取Hash中所有的value
// Redis命令: hvals key
List<String> hvals = jedis.hvals("myHash");
System.out.println("hvals: " + hvals);
}
}
效果图:
六)Set无序列表数据类型
实例:
package com.oysept.redis;
import redis.clients.jedis.Jedis;
public class RedisSetCache {
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost", 6379);
// 删除指定的key, 相当于把整个key在Redis中删除了
// Redis命令: del key [key ...]
jedis.del("mySet");
// 设置一个Set, 往列表中添加元素, 该列表是一个无序的列表
// Redis命令: sadd key member [member ...]
// smembers key
jedis.sadd("mySet", "111", "222", "333");
System.out.println("sadd: " + jedis.smembers("mySet"));
// 删除Set中某个元素
// Redis命令: srem key member [member ...]
jedis.srem("mySet", "222");
System.out.println("srem: " + jedis.smembers("mySet"));
// 弹出Set中尾部元素, 相当于删除尾部元素
// Redis命令: srem key member [member ...]
jedis.spop("mySet");
System.out.println("spop: " + jedis.smembers("mySet"));
// 返回Set中元素个数
// Redis命令: scard key
Long scard = jedis.scard("mySet");
System.out.println("scard: " + scard);
}
}
效果图:
七)ZSet有序列表数据类型
实例:
package com.oysept.redis;
import java.util.HashMap;
import java.util.Map;
import redis.clients.jedis.Jedis;
public class RedisZSetCache {
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost", 6379);
// 删除指定的key, 相当于把整个key在Redis中删除了
// Redis命令: del key [key ...]
jedis.del("myZSet");
// 设置一个ZSet, 往列表中添加元素, 该列表是一个有序的列表
// Redis命令: zadd key [NX|XX] [CH] [INCR] score member [score member ...]
// zrange key start stop [WITHSCORES]
Map<String, Double> zadd = new HashMap<String, Double>(); // Map中的元素是无序的
zadd.put("zadd1", 100D);
zadd.put("zadd2", 200D);
zadd.put("zadd3", 300D);
zadd.put("zadd4", 100D);
jedis.zadd("myZSet", zadd);
System.out.println("zadd: " + jedis.zrange("myZSet", 0, -1));
// 删除ZSet中某个元素
// Redis命令: zrem key member [member ...]
jedis.zrem("myZSet", "zadd3");
System.out.println("zrem: " + jedis.zrange("myZSet", 0, -1));
// 倒序展示ZSet中的元素
// Redis命令: zrevrange key start stop [WITHSCORES]
System.out.println("zrevrange: " + jedis.zrevrange("myZSet", 0, -1));
System.out.println("zrevrangeWithScores: " + jedis.zrevrangeWithScores("myZSet", 0, -1));
// 返回ZSet中元素个数
// Redis命令: zcard key
Long zcard = jedis.zcard("myZSet");
System.out.println("zcard: " + zcard);
}
}
效果图:
八)Jedis驱动类中Redis命令枚举
在redis.clients.jedis.Protocol类中:
public static enum Command implements ProtocolCommand {
PING, SET, GET, QUIT, EXISTS, DEL, UNLINK, TYPE, FLUSHDB, KEYS, RANDOMKEY, RENAME, RENAMENX,
RENAMEX, DBSIZE, EXPIRE, EXPIREAT, TTL, SELECT, MOVE, FLUSHALL, GETSET, MGET, SETNX, SETEX,
MSET, MSETNX, DECRBY, DECR, INCRBY, INCR, APPEND, SUBSTR, HSET, HGET, HSETNX, HMSET, HMGET,
HINCRBY, HEXISTS, HDEL, HLEN, HKEYS, HVALS, HGETALL, RPUSH, LPUSH, LLEN, LRANGE, LTRIM, LINDEX,
LSET, LREM, LPOP, RPOP, RPOPLPUSH, SADD, SMEMBERS, SREM, SPOP, SMOVE, SCARD, SISMEMBER, SINTER,
SINTERSTORE, SUNION, SUNIONSTORE, SDIFF, SDIFFSTORE, SRANDMEMBER, ZADD, ZRANGE, ZREM, ZINCRBY,
ZRANK, ZREVRANK, ZREVRANGE, ZCARD, ZSCORE, ZPOPMAX, ZPOPMIN, MULTI, DISCARD, EXEC, WATCH,
UNWATCH, SORT, BLPOP, BRPOP, AUTH, SUBSCRIBE, PUBLISH, UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE,
PUBSUB, ZCOUNT, ZRANGEBYSCORE, ZREVRANGEBYSCORE, ZREMRANGEBYRANK, ZREMRANGEBYSCORE, ZUNIONSTORE,
ZINTERSTORE, ZLEXCOUNT, ZRANGEBYLEX, ZREVRANGEBYLEX, ZREMRANGEBYLEX, SAVE, BGSAVE, BGREWRITEAOF,
LASTSAVE, SHUTDOWN, INFO, MONITOR, SLAVEOF, CONFIG, STRLEN, SYNC, LPUSHX, PERSIST, RPUSHX, ECHO,
LINSERT, DEBUG, BRPOPLPUSH, SETBIT, GETBIT, BITPOS, SETRANGE, GETRANGE, EVAL, EVALSHA, SCRIPT,
SLOWLOG, OBJECT, BITCOUNT, BITOP, SENTINEL, DUMP, RESTORE, PEXPIRE, PEXPIREAT, PTTL, INCRBYFLOAT,
PSETEX, CLIENT, TIME, MIGRATE, HINCRBYFLOAT, SCAN, HSCAN, SSCAN, ZSCAN, WAIT, CLUSTER, ASKING,
PFADD, PFCOUNT, PFMERGE, READONLY, GEOADD, GEODIST, GEOHASH, GEOPOS, GEORADIUS, GEORADIUS_RO,
GEORADIUSBYMEMBER, GEORADIUSBYMEMBER_RO, MODULE, BITFIELD, HSTRLEN, TOUCH, SWAPDB, MEMORY,
XADD, XLEN, XDEL, XTRIM, XRANGE, XREVRANGE, XREAD, XACK, XGROUP, XREADGROUP, XPENDING, XCLAIM,
ACL, XINFO, BITFIELD_RO;
private final byte[] raw;
Command() {
raw = SafeEncoder.encode(this.name());
}
@Override
public byte[] getRaw() {
return raw;
}
}
识别二维码关注个人微信公众号
本章完结,待续,欢迎转载!
本文说明:该文章属于原创,如需转载,请标明文章转载来源!