redis 拓展2

package com.test.ziyou.hot;

import redis.clients.jedis.Jedis;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import static com.test.ziyou.common.JedisManager.getJedis;

/**
* Created by ~~
* 2019/6/4.
*/
public class HotTopic {
    private static Map<String,Double> getRandMembers(){
        Map<String,Double> members = new HashMap<>();
        members.put("XX愛上love",100d);
        members.put("ximei要去mama",80.6d);
        members.put("LIGO發現最大...",50d);
        members.put("女主播meico退休",95.8d);
        members.put("嗯哼不想娶sb",95.2d);
        return members;
    }
    public static void main(String[] args) {
        try(Jedis jedis = getJedis()){
            jedis.zadd("memebers",getRandMembers());
            Set<String> memebers = jedis.zrevrange("memebers", 0, 5);
            for(String member:memebers){
                System.out.println(member);
            }
        }
    }
}
package com.test.ziyou.pubsub;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;
import static com.test.ziyou.common.JedisManager.getJedis;

/**
* Created by ~~
* 2019/6/4.
*/
public class Subscriber {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++){
            new Thread(()->{
                try (Jedis jedis = getJedis()) {
                    System.out.println(Thread.currentThread().getName() + " 啓動監聽...");
                    jedis.subscribe(new MyJedisPubSub(),"channel:1");
                }
            },"Thread_" + i).start();
        }
    }
}

class MyJedisPubSub extends JedisPubSub {
    @Override
    public void onMessage(String channel, String message) {
        System.out.printf("%s: 接收到消息,通道號:%s 消息內容:%s\n",Thread.currentThread().getName(), channel, message);
    }

    @Override
    public void onPMessage(String pattern, String channel, String message) {
    }

    @Override
    public void onSubscribe(String channel, int subscribedChannels) {
    }

    @Override
    public void onUnsubscribe(String channel, int subscribedChannels) {
    }

    @Override
    public void onPUnsubscribe(String pattern, int subscribedChannels) {
    }

    @Override
    public void onPSubscribe(String pattern, int subscribedChannels) {
    }
}
package com.test.ziyou.pubsub;

import redis.clients.jedis.Jedis;
import static com.test.ziyou.common.JedisManager.getJedis;

/**
* Created by ~~
* 2019/6/4.
*/
public class Publisher {

    public static void main(String[] args) {
        try (Jedis jedis = getJedis();) {
            jedis.publish("channel:1", "hello world");
            System.out.println("發佈消息:hello world");
            jedis.publish("channel:1", "你好");
            System.out.println("發佈消息:你好");
        }
    }
}
package com.test.ziyou.lottery;

import redis.clients.jedis.Jedis;
import static com.test.ziyou.common.JedisManager.getJedis;

/**
* Created by ~~
* 2019/6/3.
*/
public class Lottery {
    private static final String COLLECTION_NAME = "sn_o2o_members";

    public static void initMembers() {
        try (Jedis jedis = getJedis()) {
            String[] members = new String[] {"sb1(111)", "sb2(222)", "sb3(333)", "sb4(444)", "sb5(555)", "sb6(666)", "sb7(777)" };
            jedis.sadd(COLLECTION_NAME, members);
            System.out.println("初始化人員信息成功,可以開始抽獎了");
        }
    }

    public static void lottery(int leval) {
        try (Jedis jedis = getJedis()) {
            System.out.printf("%s等獎,恭喜中獎人員:%s\n", leval, jedis.spop(COLLECTION_NAME));
        }
    }

    public static void beginLottery() throws InterruptedException {
        initMembers();
        for (int i = 3; i > 0; i--) {
            lottery(i);
            Thread.sleep(1000);
        }
    }

    public static void main(String[] args) throws InterruptedException {
//        beginLottery();
        test();
    }

    private static void test() throws InterruptedException {
        try (Jedis jedis = getJedis()) {
            String[] members = new String[] { "sb1(111)", "sb2(222)",
                    "sb3(333)", "sb4(444)", "sb5(555)",
                    "sb6(666)" };
            jedis.sadd(COLLECTION_NAME, members);
            System.out.println("初始化人員信息成功,可以開始抽獎了");
            for (int i = 3; i > 0; i--) {
                System.out.printf("%s等獎,恭喜中獎人員:%s\n", i, jedis.spop(COLLECTION_NAME));
                Thread.sleep(1000);
            }
        }
    }

}
package com.test.ziyou.visitlimit;

import redis.clients.jedis.Jedis;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import static com.test.ziyou.common.JedisManager.getJedis;

/**
* Created by ~~
* 2019/6/4.
*/
public class LimitByLua {

    public static void main(String[] args) throws IOException, InterruptedException {
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < 20; i++) {
            executorService.execute(new Limit(getJedis()));
        }
        System.in.read();
    }

    static class Limit implements Runnable{
        private Jedis jedis;
        public Limit(Jedis jedis) {
            this.jedis = jedis;
        }

        @Override
        public void run() {
            try {
                List<String> keys = new ArrayList();
                keys.add("user:ip:192.168.3.2");//限流針對的key
                List<String> argv = new ArrayList();
                argv.add("1");//1秒鐘,允許最大訪問量8個,若超過則限流
                argv.add("8");
                String scriptLoad = "abcb1d742f358419c3809080eb80faf67589ff71";
                Thread.sleep(new Random().nextInt(10) * 100);
                Object result = jedis.evalsha(scriptLoad, keys, argv);
                System.out.println(result);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                jedis.close();
            }
        }
    }
}
package com.test.ziyou.lua;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import java.util.ArrayList;
import java.util.List;

/**
* Created by ~~
* 2019/6/3.
*/
public class RedisCallLuaDemo {

    private JedisPool jedisPool;

    @Before
    public void setUp() {
        GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
        //最大連接數
        genericObjectPoolConfig.setMaxTotal(100);
        //最大空閒連接數
        genericObjectPoolConfig.setMaxIdle(10);
        //最小空閒連接數
        genericObjectPoolConfig.setMinIdle(0);
        //在取連接時測試連接的可用性
        genericObjectPoolConfig.setTestOnBorrow(true);
        //在還連接時不再測試連接的可用性
        genericObjectPoolConfig.setTestOnReturn(false);
        jedisPool = new JedisPool(genericObjectPoolConfig, "10.47.229.190", 6379);
    }

    @After
    public void destroy() {
        jedisPool.destroy();
    }

    @Test
    public void eval() {
        try (Jedis jedis = jedisPool.getResource()) {
            List<String> keys = new ArrayList();
            keys.add("user:1");
            List<String> argv = new ArrayList();
            argv.add("zhangsan2");
            jedis.eval("redis.call('set',KEYS[1],ARGV[1])", keys, argv);
            System.out.println(jedis.get("user:1"));
        }
    }

    @Test
    public void scriptLoad() {
        System.out.println(this.generateSha1());
    }

    private String generateSha1() {
        try (Jedis jedis = jedisPool.getResource()) {
            jedis.expire("a", 100);
            String lua = "local key = KEYS[1]\n"
                    + "local seconds = ARGV[1]\n"
                    + "local maxCount = ARGV[2]\n"
                    + "local currentCount = redis.call(\"incr\",key)\n"
                    + "if tonumber(currentCount) == 1 then\n"
                    + "   redis.call(\"expire\",key,tonumber(seconds))\n"
                    + "   return seconds\n"
                    + "elseif tonumber(currentCount) > tonumber(maxCount) then\n"
                    + "   return \"sorry,you are limited,ttl: \"..redis.call(\"ttl\",key)\n"
                    + "else\n"
                    + "   return redis.call(\"ttl\",key)\n"
                    + "end\n";
            return jedis.scriptLoad(lua);
        }
    }

    @Test
    public void limit() {
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                try {
                    limitByTime("phone:157l3452323", 10, 9);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }).start();
        }
        try {
            Thread.sleep(10000);
            //System.in.read();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 限流方法
     * @param key      鍵
     * @param expire   時間
     * @param maxCount 指定時間內允許的最大請求量
     */
    private void limitByTime(String key, int expire, int maxCount) throws Exception {
        try (Jedis jedis = jedisPool.getResource()) {
            Long currentCount = jedis.incr(key);
            if (1 == currentCount) {
                jedis.expire(key, expire);
            } else if (currentCount > maxCount) {
                System.out.printf("請求數超過流控範圍,expiretime=%s,maxcount=%s,currentCount=%s\r\n", expire, maxCount, currentCount);
                throw new Exception("被限流了");
            } else {
                System.out.printf("expiretime=%s,maxcount=%s,currentCount=%s\r\n", expire, maxCount, currentCount);
            }
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章