Redis基本数据结构类型
Demo代码
代码语言:javascript
复制import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.ListPosition;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @Author: www.itze.cn
* @Email: 814565718@qq.com
*/
public class RedisDemo {
/**
* Jedis连接池连接
*/
public static Jedis getJedisByPool() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//设置最大连接数
jedisPoolConfig.setMaxTotal(30);
//设置最大空闲数
jedisPoolConfig.setMaxIdle(10);
//获取连接池
JedisPool jedisPool = new JedisPool(jedisPoolConfig, "192.168.06.37", 6379);
return jedisPool.getResource();
}
/**
* Redis数据结构-String
*/
public static void redisStringType() {
Jedis jedis = RedisDemo.getJedisByPool();
jedis.set("test", "123");//设置字符串类型key,value
jedis.get("test");//获取字符串类型value
/**
* 以下有关增减的只对value数字类的有用
*/
jedis.incr("test");//将key值为:test的value值加1
jedis.decr("test");//将key值为:test的value值减1
jedis.incrBy("test", 10);//将key值为:test的value值加10
jedis.decrBy("test", 5);//将key值为:test的value值加5
jedis.append("test", "hello");//在key值为:test的value值后面拼接:hello
jedis.exists("test");//判断test的key值是否
}
/**
* Redis数据结构-Hash
* 存储形式为:key value,其中value为键值对形式
*/
public static void redisHashType() {
Jedis jedis = RedisDemo.getJedisByPool();
Map<String, String> map = new ConcurrentHashMap<>();
map.put("name", "xiaoming");
map.put("sex", "男");
jedis.hset("user", map);//可以直接存入map
jedis.hset("user", "age", "18");
jedis.hget("user", "name");//获取user中name键值对
jedis.hgetAll("user");//获取user中所有的键值对信息
jedis.hincrBy("user", "age", 2);//将age加2
jedis.hkeys("user");//查看user中所有的key值,name/sex/age
jedis.hvals("user");//查看user中所有的value值,xiaoming...
jedis.hlen("user");//获取user中键值对的个数
jedis.hdel("user", "age");//删除age键值对
jedis.hexists("user", "age");//判断user中是否存在key值为age的键值对
}
/**
* Redis数据结构-List
* 双向链表结构,从链表的两头插入、删除元素会比较高效
*/
public static void redisListType() {
Jedis jedis = RedisDemo.getJedisByPool();
jedis.lpush("list1", "a", "b", "c");//将a/b/c从左侧(链表的前)压入list1中
jedis.rpush("list2", "a", "b", "c");//将a/b/c从右侧(链表的后)压入list2中
jedis.lset("list1", 1, "123");//将下标1的b更改为123
jedis.lrange("list", 0, -1);//查看list中元素,-1代表最后一个
jedis.linsert("list", ListPosition.BEFORE, "a", "x");//在元素a的前面插入x
/**
* lrem
* key:list
* count:2,代表从前向后遍历删除前两个a元素
* count:0,代表删除list中所有a元素
* count:-1,代表从后往前遍历删除,从后往前数,第一个a元素
*/
jedis.lrem("list1", 2, "a");
jedis.llen("list1");//查看list中元素个数
jedis.lpop("list1");//将第一个元素弹出来,弹出之后list1中将不存在该元素
jedis.lpushx("list1", "w");//仅当list1存在时在头部插入w
jedis.rpoplpush("lsit1", "list2");//将lsit1的尾部最后一个元素弹出,并压入list2的头部第一个位置
}
/**
* Redis数据结构-Set
* 不允许元素重复
*/
public static void redisSetType() {
Jedis jedis = RedisDemo.getJedisByPool();
jedis.sadd("set1", "123", "b", "b", "a");//添加一个set集合
jedis.sadd("set2", "12", "x", "b", "a");//添加一个set集合
jedis.srem("set1", "123");//删除set1集合中的123元素
jedis.sismember("set1", "123");//判断set1集合中123元素是否存在
/**
* 差集运算
* 比较两个集合中的差集,和kyes放置的顺序有关系
* set1:1,2,3/set2:2,3,4,5
* eg:jesit.sdiff("set1","set2")
* 结果:1
* 会返回set1中哪些元素是set2集合中没有的
*/
jedis.sdiff("set1", "set2");//差集运算
jedis.sdiffstore("set3", "set1", "set2");//将set1集合和set2集合,差集存到set3集合中
jedis.sinter("set1", "set2");//交集运算,返回两集合中共有的元素
jedis.sinterstore("set4", "set1", "set2");//将set1和set2共有的元素存入set4集合中
jedis.sunion("set1", "set2");//并集运算,返回两个集合所有的元素,set集合会自动去重
jedis.sunionstore("set5", "set1", "set2");//将set1和set2集合中所有元素,存入set5集合
jedis.smembers("set1");//查看set1集合中有哪些元素
jedis.scard("set1");//返回set1集合中元素数量
jedis.srandmember("set1");//随机返回set1集合中的一个元素
}
/**
* Redis数据结构 sorted-Set
* 不允许元素重复
* 每个元素都有一个分数值
*/
public static void sortedSetType() {
Jedis jedis = RedisDemo.getJedisByPool();
Map<String, Double> map = new HashMap<>();
map.put("ls", 100.0);
map.put("ww", 99.0);
map.put("w2", 50.0);
map.put("w1", 69.0);
map.put("w3", 64.0);
jedis.zadd("sortedSet1", 80, "zs");//添加元素,返回新添加元素的个数,注意是新添加成功的
jedis.zadd("sortedSet1", 100, "zs");//如果再次添加zs的分值数将会更新成100
jedis.zadd("sortedSet1", map);//添加元素,支持map键值对形式
jedis.zscore("sortedSet1", "zs");//获取sortedSet1集合中zs的分数,返回结果100
jedis.zcard("sortedSet1");//获取sortedSet1集合成员的数量
jedis.zrem("sortedSet1", "zs");//删除sortedSet1集合中zs元素
jedis.zrange("sortedSet1",0,1);//查询范围,返回下标0-1也就是前2个元素
/**
* 查询范围并按照分数值从小到大排列,
* 返回结果Set<Tuple>,
* 遍历得到Tuple类型,
* getScore:分数值,
* getElement:元素名
*/
jedis.zrangeWithScores("sortedSet1",0,-1);//-1即最后一个元素,按照分数值从小大到
jedis.zrevrangeWithScores("sortedSet1",0,-1);//按照分数值从大到小
jedis.zrangeByScore("sortedSet1",60.0,99.0);//按照分数值范围查找元素名,eg:60.0最小值,99.0最大值,包含边界
jedis.zremrangeByRank("sortedSet1",0,1);//按照范围删除,即删除下标0-1的前两个
jedis.zremrangeByScore("sortedSet1",0,60);//按照分数值范围删除,即删除大于等于0小于等于60的元素
/**
* zrangeByScoreWithScores
* 按照分数值从小到大排序
* 按照分数值范围20.0-90.0
* 并且限制只要0,3 前3个元素,就如SQL中的limit效果一样
* zrevrangeByScoreWithScores
* 按照分数值从大到小排序
* *********************************************************************
* 注意:zrangeByScoreWithScores,从小到大的排列
* key值sortedSet1后面第一个是最小分数值,第二个是最大分数值
* zrevrangeByScoreWithScores,从大到小的排列
* key值sortedSet1后面第一个是最大分数值,第二个是最小分数值
*/
jedis.zrangeByScoreWithScores("sortedSet1",20.0,90.0,0,3);//从小到大
jedis.zrevrangeByScoreWithScores("sortedSet1",90.0,20.0,0,3);//从大到小
jedis.zincrby("sortedSet1",30.0,"w3");//增加指定元素分数值,eg:w3分数值在原有基础增加30
jedis.zcount("sortedSet1",60.0,100.0);//获取指定分数值范围元素的个数,eg:大于等于60小于等于100的元素个数
}
}