一、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 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 map = new HashMap();
map.put("big1", "上海");
map.put("big2", "香港");
map.put("big3", "武汉");
jedis.hmset("bigCity2", map);
List 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 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
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
int number = random.nextInt(base.length());
sb.append(base.charAt(number));
}
return sb.toString();
}
}
完整代码见github:
本文来源于:《从零开始学Redis》高洪涛 刘河飞 编著
未完,待续!