手记

Java操作Redis(二)

一、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》高洪涛 刘河飞 编著

未完,待续!

2人推荐
随时随地看视频
慕课网APP