一、Java操作Redis字符串类型
import redis.clients.jedis.Jedis; /** * Java操作Redis 字符串类型 * * @author liuhefei * 2018年9月17日 */ public class RedisString { public static Jedis getJedis(){ //连接Redis服务器 Jedis jedis = new Jedis("127.0.0.1",6379); System.out.println("redis服务器连接成功!"); return jedis; } /** * Redis的key类型 */ public void redisKey(){ Jedis jedis = getJedis(); jedis.set("mykey", "redis data type"); System.out.println("查看键为mykey的是否存在:"+jedis.exists("mykey")); System.out.println("键mykey的值为:"+jedis.get("mykey")); System.out.println("查看键为mykey的类型:"+jedis.type("mykey")); System.out.println("随机获得一个key:"+jedis.randomKey()); System.out.println("将mykey重命名为mykey1:"+ jedis.rename("mykey", "mykey1")); System.out.println("删除key为mykey:"+jedis.del("mykey")); } /** * Redis的String类型 */ public void redisString(){ Jedis jedis = getJedis(); System.out.println("设置name:"+jedis.set("name", "小花")); System.out.println("设置name1:"+jedis.set("name1", "小花1")); System.out.println("设置name2:"+jedis.set("name2", "小花2")); System.out.println("设置name,如果存在返回0:"+jedis.setnx("name", "小花哈哈")); System.out.println("获取key为name和name1的value值:"+jedis.mget("name","name1")); System.out.println("自增1:"+jedis.incr("index")); System.out.println("自增1:"+jedis.incr("index")); System.out.println("自增2:"+jedis.incrBy("count", 2)); System.out.println("自增2:"+jedis.incrBy("count", 2)); System.out.println("递减1:"+jedis.decr("count")); System.out.println("递减2:"+jedis.decrBy("index",2)); System.out.println("在name后面添加String:"+jedis.append("name", ",我爱你")); System.out.println("获取key为name的值:"+jedis.get("name")); } public static void main(String[] args) { RedisString redis = new RedisString(); redis.redisKey(); redis.redisString(); } }
二、Java操作Redis列表类型
import java.util.List; import redis.clients.jedis.Jedis; /** * Java操作Redis 列表类型 * * @author liuhefei * 2018年9月17日 */ public class RedisList { public static Jedis getJedis(){ //连接Redis服务器 Jedis jedis = new Jedis("127.0.0.1",6379); System.out.println("redis服务器连接成功!"); return jedis; } /** * redis的list类型 */ public void redisList(){ Jedis jedis = getJedis(); //在列表的头部添加数据 jedis.lpush("list", "姗姗","age","20","address","beijing"); //在列表的尾部添加数据 jedis.rpush("height", "170cm","cupSize","C罩杯"); //返回长度 System.out.println("列表长度:" + jedis.llen("list")); System.out.println("列表list下标为2的元素:" + jedis.lindex("list", 2)); System.out.println("移除一个元素:" + jedis.lrem("list", 1, "age")); System.out.println("将列表 key 下标为 index 的元素的值设置为 value:" + jedis.lset("list", 5, "hello world")); System.out.println("移除并返回列表list的尾元素:" + jedis.rpop("list")); //取值 List<String> list = jedis.lrange("list", 0, -1); for(String str : list){ System.out.println(str); } //System.out.println("删除key为list的数据"+jedis.del("list")); System.out.println("删除key为height的数据"+jedis.del("height")); } public static void main(String[] args) { RedisList redis = new RedisList(); redis.redisList(); } }
三、Java操作Redis集合类型
import redis.clients.jedis.Jedis; /** * Java操作Redis集合类型 * * @author liuhefei * 2018年9月17日 */ public class RedisSet { public static Jedis getJedis(){ //连接Redis服务器 Jedis jedis = new Jedis("127.0.0.1",6379); System.out.println("redis服务器连接成功!"); return jedis; } /** * redis的set类型 */ public void redisSet(){ Jedis jedis = getJedis(); jedis.sadd("city", "北京","上海","广州","深圳","昆明","武汉","大理"); System.out.println("取出集合的头部元素:" + jedis.spop("city")); System.out.println("随机取出一个值:"+ jedis.srandmember("city")); /*Redis Srem 命令用于移除集合中的一个或多个成员元素,不存在的成员元素会被忽略。 当 key 不是集合类型,返回一个错误。 */ jedis.srem("city", "北京"); //Redis Smembers 命令返回集合中的所有的成员。 不存在的集合 key 被视为空集合。 System.out.println(jedis.smembers("city")); //Redis Sismember 命令判断成员元素是否是集合的成员。 判断深圳是否是city集合的元素 System.out.println(jedis.sismember("city", "深圳")); //Redis Srandmember 命令用于返回集合中的一个随机元素。 System.out.println(jedis.srandmember("city")); //Redis Scard 命令返回集合中元素的数量。 System.out.println(jedis.scard("city")); jedis.sadd("city2", "昆明","香港","澳门","台湾","上海","北京","成都"); System.out.println("交集:"+jedis.sinter("city","city2")); System.out.println("并集:"+jedis.sunion("city","city2")); System.out.println("差集:"+jedis.sdiff("city","city2")); } public static void main(String[] args) { RedisSet redis = new RedisSet(); redis.redisSet(); } }
四、Java操作Redis哈希表类型
import java.util.HashMap; import java.util.List; import java.util.Map; import redis.clients.jedis.Jedis; /** * Java操作Redis 哈希表类型 * * @author liuhefei * 2018年9月17日 */ public class RedisHash { public static Jedis getJedis(){ //连接Redis服务器 Jedis jedis = new Jedis("127.0.0.1",6379); System.out.println("redis服务器连接成功!"); return jedis; } /** * redis 哈希(map)数据类型 */ public void redisMap(){ Jedis jedis = getJedis(); jedis.hset("bigCity", "big", "北京"); System.out.println("取值:" + jedis.hget("bigCity", "big")); Map<String,String> map = new HashMap<String,String>(); map.put("big1", "上海"); map.put("big2", "香港"); map.put("big3", "武汉"); jedis.hmset("bigCity2", map); List<String> list1 = jedis.hmget("bigCity2", "big1","big2","big3"); for(String str1 : list1){ System.out.println(str1); } //删除map中的某个键值 jedis.hdel("bigCity2", "上海"); System.out.println(jedis.hmget("bigCity2", "height")); //因为删除了,所有返回的是null System.out.println(jedis.hlen("bigCity2")); //返回key为bigCity2的键中存放的值的个数2 System.out.println(jedis.exists("bigCity2"));//是否存在key为bigCity2的记录 返回true System.out.println(jedis.hkeys("bigCity2"));//返回map对象中的所有key System.out.println(jedis.hvals("bigCity2"));//返回map对象中的所有value } public static void main(String[] args) { RedisHash redis = new RedisHash(); redis.redisMap(); } }
五、Java操作Redis有序集合类型
import redis.clients.jedis.Jedis; /** * Java操作Redis有序集合类型 * * @author liuhefei * 2018年9月17日 */ public class RedisSortedSet { public static Jedis getJedis(){ //连接Redis服务器 Jedis jedis = new Jedis("127.0.0.1",6379); System.out.println("redis服务器连接成功!"); return jedis; } /** * Redis SortedSet(有序集合)类型 * */ public void redisSortedSet() { Jedis jedis = getJedis(); jedis.zadd("math-score", 100, "小明"); jedis.zadd("math-score", 92, "张三"); jedis.zadd("math-score", 70, "李四"); jedis.zadd("math-score", 50, "小花"); //返回有序集 math-score 中,指定区间内的成员。 System.out.println(jedis.zrange("math-score", 0, -1)); //返回有序集 math-score 的基数。 System.out.println(jedis.zcard("math-score")); //返回有序集 math-score 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。 System.out.println(jedis.zcount("math-score", 50, 90)); //为有序集 math-score 的成员 小花 的 score 值加上增量 15 。 System.out.println(jedis.zincrby("math-score", 15, "小花")); //返回有序集 math-score 中,成员 member 的 score 值。 System.out.println(jedis.zscore("math-score", "小花")); //返回有序集 math-score 中成员 张三 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。 System.out.println(jedis.zrank("math-score", "张三")); //返回有序集 math-score 中,指定区间内的成员。 System.out.println(jedis.zrevrange("math-score", 90, 100)); //返回有序集 math-score 中, score 值介于 max 和 min 之间(默认包括等于 max 或 min )的所有的成员 System.out.println(jedis.zrevrangeByScore("math-score", 100, 60)); //移除有序集 math-score 中的一个或多个成员,不存在的成员将被忽略。 System.out.println(jedis.zrem("math-score", "小花","小五")); } public static void main(String[] args) { RedisSortedSet redis = new RedisSortedSet(); redis.redisSortedSet(); } }
六、Java操作Redis实现秒杀功能
场景:1000人秒杀抢购100部手机
代码如下:
(1)SecondKill.java :主要实现秒杀抢购业务
import java.util.List; import redis.clients.jedis.Jedis; import redis.clients.jedis.Transaction; /** * 秒杀抢购 * * * @author liuhefei 2018年9月19日 */ public class SecondKill implements Runnable { String iPhone = "iPhone";// 监视keys Jedis jedis = new Jedis("127.0.0.1", 6379); String userinfo; public SecondKill() { } public SecondKill(String uinfo) { this.userinfo = uinfo; } public void run() { try { jedis.watch(iPhone);// watchkeys String val = jedis.get(iPhone); int valint = Integer.valueOf(val); if (valint <= 100 && valint >= 1) { //1.multi命令开启事务 Transaction tx = jedis.multi(); //2、命令入队 tx.incrBy("iPhone", -1); //exec命令提交事务 List<Object> list = tx.exec();// 提交事务,如果此时watchkeys被改动了,则返回null if (list == null || list.size() == 0) { String failuserifo = "fail" + userinfo; String failinfo = "用户:" + failuserifo + " 商品争抢失败,抢购失败"; System.out.println(failinfo); /* 抢购失败业务逻辑 */ jedis.setnx(failuserifo, failinfo); } else { for (Object succ : list) { String succuserifo = "succ" + succ.toString() + userinfo; String succinfo = "用户:" + succuserifo + " 抢购成功,当前抢购成功人数:" + (1 - (valint - 100)); System.out.println(succinfo); /* 抢购成功业务逻辑 */ jedis.setnx(succuserifo, succinfo); } } } else { String failuserifo = "kcfail" + userinfo; String failinfo1 = "用户:" + failuserifo + " 商品被抢购完毕,抢购失败"; System.out.println(failinfo1); jedis.setnx(failuserifo, failinfo1); // Thread.sleep(500); return; } } catch (Exception e) { e.printStackTrace(); } finally { jedis.close(); } } }
(2)SecondKillTest.java: 秒杀入口程序
import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import redis.clients.jedis.Jedis; /** * Redis秒杀功能的实现 1000个人抢购100部手机 * * * @author liuhefei 2018年9月19日 */ public class SecondKillTest { public static void main(String[] args) { final String iPhone = "iPhone"; ExecutorService executor = Executors.newFixedThreadPool(20); // 20个线程池并发数 final Jedis jedis = new Jedis("127.0.0.1", 6379); jedis.del(iPhone); //先删除 jedis.set(iPhone, "100");// 设置起始的抢购数 jedis.close(); for (int i = 0; i < 1000; i++) {// 设置1000个人来发起抢购 executor.execute(new SecondKill("user" + getRandomString(6))); } executor.shutdown(); } /** * 生成用户id * @param length * @return * * @author liuhefei * 2018年9月19日 */ public static String getRandomString(int length) { // length是随机字符串长度 String base = "abcdefghijklmnopqrstuvwxyz0123456789"; Random random = new Random(); StringBuffer sb = new StringBuffer(); for (int i = 0; i < length; i++) { int number = random.nextInt(base.length()); sb.append(base.charAt(number)); } return sb.toString(); } }
完整代码见github:
https://github.com/JavaCodeMood/JedisDemo.git
本文来源于:《从零开始学Redis》高洪涛 刘河飞 编著
未完,待续!