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);
}
}
}
}