本篇内容主要讲解“Redis的介绍及应用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis的介绍及应用”吧!
官网下不了,这里找了这个地址,版本比较老
下载驱动,搜索jedis
参考
基本操作
public class RedisTest {
public static void main(String[] args) {
/**
* 地址 端口 超时时间
*/
Jedis jedis = new Jedis("localhost", 6379, 100000);
/**
* 测试是否通
*/
System.out.println("服务正在运行: "+jedis.ping());
/**
* set:设置key值
* get:获取key值
* del:删除key
* append:追加key值
* incr:key值自增1
* incrBy:key值自增,指定步长
* decr:key值自减1
* decrBy:key值自减,指定步长
* expire:为key设置过期时间(秒数)
* setex:设置key值,可指定存活时间(秒数)
* setnx:设置key值。key不存在才会设置,如果key存在则回滚操作,结果返回0,表示没有设置成功
* ttl:time to live,获取key的存活时间(秒),-1表示永不过期
* persist:去掉key的expire设置,不再有失效时间
*/
jedis.set("first", "Hello World!");
System.out.println(jedis.get("first"));
/**
* LIST
* 可以实现队列的功能
* lpush: 从列表头部插入多个元素
* rpush:从列表尾部插入多个元素
* llen:返回列表中的元素的数量
* lpop:从列表头部移除并返回list的第一个元素
* lrem:从头部开始找,删除n个值
* lrange:从列表中获取指定范围的子集
*/
jedis.del("list");
jedis.lpush("list", "1","2","3");
jedis.lpush("list", "4");
Long count=jedis.llen("list");
List<String> list=jedis.lrange("list", 0, count);
System.out.println(list.toString());
/**
* sadd:往set对象中添加一个值
* smembers:取得set中所有的值
* sismember:判断一个值是否在set中存在
* srandmember:从set中随机取得一个值
* srem:从set中删除一个值
* scard:返回set的item个数
*/
jedis.del("set");
jedis.sadd("set", "1","2","3");
jedis.sadd("set", "4");
jedis.sadd("set", "4");
Set<String> set=jedis.smembers("set");
System.out.println(set.toString());
/**
* hmset:设置key值,值类型为map对象
* type:返回key值的类型,可能值有none, string, hash, set, list, zset
* hkeys:获取所有key
* hvals:获取所有key对应的值
* hmget:一次性获取多个field的值
* hexists:判断field是否存在
* hset:设置field的值
* hgetAll:获取全部内容
* hget:获取field的值
* hdel:删除field
* hincrBy:field值自增1
* hlen:计算field的数目
* hsetnx:设置key值。field不存在才会设置,如果field存在则回滚操作,结果返回0,表示没有设置成功。可以用来实现分布式锁
*/
jedis.del("user");
Map<String, String> map = new HashMap<String, String>();
map.put("name", "cjm");
map.put("age", "33");
map.put("qq", "123456");
jedis.hmset("user", map);
System.out.println("type: " + jedis.type("user"));
System.out.println("hkeys: " + jedis.hkeys("user"));
System.out.println("hvals: " + jedis.hvals("user"));
System.out.println("hmget: " + jedis.hmget("user", "name", "age"));
System.out.println("hexists: " + jedis.hexists("user", "name"));
jedis.hset("user", "pwd", "123");
System.out.println("hgetAll: " + jedis.hgetAll("user"));
System.out.println("hget: " + jedis.hget("user", "pwd"));
jedis.hdel("user", "qq");
System.out.println("hincrBy: " + jedis.hincrBy("user", "count", 1));
System.out.println("hlen: " + jedis.hlen("user"));
Long r = jedis.hsetnx("user", "pwd2", "456");
System.out.println(r);
}
}
消息订阅、
订阅
public class Consumer {
public static void main(String[] args) {
/**
* 地址 端口 超时时间
*/
Jedis jedis = new Jedis("localhost", 6379, 100000);
/**
* 消息订阅
*/
JedisPubSub jps=new JedisPubSub() {
public void onPMessage(String pattern, String channel, String message) {
System.out.println("onPMessage()," + pattern + "=" + channel + "="
+ message);
}
public void onMessage(String channel, String message) {
System.out.println("onMessage()," + channel + "=" + message);
}
};
jedis.psubscribe(jps, "test*");
}
}
//发布
jedis.publish("test1", "message from test1");
jedis.publish("test2", "message from test2");
redis分布式锁
public class RedisTool {
private static final String LOCK_SUCCESS = "OK";
private static final Long RELEASE_SUCCESS = 1L;
/**
* 尝试获取分布式锁
* @param jedis Redis客户端
* @param lockKey 锁
* @param requestId 请求标识
* @param expireTime 超期时间
* @return 是否获取成功
*/
public static boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId, int expireTime) {
String result = jedis.set(lockKey, requestId,new SetParams().nx().ex(expireTime));
if (LOCK_SUCCESS.equals(result)) {
return true;
}
return false;
}
/**
* 释放分布式锁
* @param jedis Redis客户端
* @param lockKey 锁
* @param requestId 请求标识
* @return 是否释放成功
*/
public static boolean releaseDistributedLock(Jedis jedis, String lockKey, String requestId) {
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));
if (RELEASE_SUCCESS.equals(result)) {
return true;
}
return false;
}
}
public class LockTest {
public static void main(String[] args) {
Runnable rn = new Runnable() {
@Override
public void run() {
Jedis jedis = new Jedis("localhost", 6379, 100000);
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
int tryCount=5;
while (true) {
Boolean lock = RedisTool.tryGetDistributedLock(jedis, "lock", uuid, 10);
if (lock) {
System.out.println(Thread.currentThread().getName() + "获取锁");
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
Boolean unlock = RedisTool.releaseDistributedLock(jedis, "lock", uuid);
if (unlock) {
System.out.println(Thread.currentThread().getName() + "释放锁");
break;
}
}
if(tryCount<0) {
break;
}else {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "尝试次数:"+tryCount);
tryCount--;
}
}
}
};
for (int i = 0; i < 20; i++) {
Thread t = new Thread(rn);
t.start();
}
LockSupport.park();
}
}
锁测试
package com.redis;
import java.util.UUID;
import java.util.concurrent.locks.LockSupport;
import redis.clients.jedis.Jedis;
public class ProductServer {
/**
* 向服务端添加货
*
* @return
*/
public boolean addProduct(Jedis jedis, String key, int i) {
System.out.println("货物:" + key + "添加库存:" + i);
if (i > 0) {
System.out.println("---添加货物:" + key + "数量:" + i + "---");
// 获取值
String count = jedis.get(key);
System.out.println("剩余库存:" + count);
if (null == count || Integer.valueOf(count) <= 0) {
System.out.println("---当前货物:" + key + "数量已销售完毕");
System.out.println("---当前货物:" + key + "添加开始");
jedis.set(key, i + "");
System.out.println("---当前货物:" + key + "添加结束");
return true;
}
}
return false;
}
/**
* 消费数据
*/
public boolean decryProduct(Jedis jedis, String key, String requestID) {
try {
Boolean lock = RedisTool.tryGetDistributedLock(jedis, "lock", requestID, 100);
if (!lock) {
System.out.println("请稍后重试...");
return false;
}
System.out.println("货物:" + key + "线程:" + Thread.currentThread().getName() + "消费数据:" + requestID);
String count = jedis.get(key);
if (null != count && Integer.valueOf(count) > 0) {
jedis.decr(key);
count = jedis.get(key);
System.out.println("剩余库存:" + count);
return true;
}
} catch (Exception e) {
} finally {
RedisTool.releaseDistributedLock(jedis, "lock", requestID);
}
return false;
}
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost", 6379, 10000);
ProductServer ps = new ProductServer();
ps.addProduct(jedis, "shouji", 10);
Runnable rn = new Runnable() {
@Override
public void run() {
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
Jedis jedis = new Jedis("localhost", 6379, 10000);
ps.decryProduct(jedis, "shouji", uuid);
}
};
for (int i = 0; i < 15; i++) {
Thread td = new Thread(rn);
td.start();
}
LockSupport.park();
}
}
到此,相信大家对“Redis的介绍及应用”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/findurl/blog/3103649