一、redis支持的数据结构:
最近开始总结redis的相关知识,毕竟今年的行情不好,时刻总结回顾知识点,投资自己哪怕被优化也能时刻上手面试。
1、String
特点:
一个键能储存512MB
string类型是二进制安全的,可以存储任何数据,比如jpg图片或序列化对象;
适用场景:常规key-value缓存应用。常规计数: 微博数, 粉丝数。
2、Hash
适用场景:比较适合于存储对象
3、List
适用场景:Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现。使用Lists结构,我们可以轻松地实现最新消息排行等功能。Lists的另一个应用就是消息队列,可以利用Lists的PUSH操作,将任务存在Lists中,然后工作线程再用POP操作将任务取出进行执行。Redis还提供了操作Lists中某一段的api,你可以直接查询,删除Lists中某一段的元素。
4、set
适用场景:set是一个无需且自动排重的列表数据,如果需要存储一个列表,不希望有重复数据,可以选择使用set,并且set提供了判断成员是否存在的接口。
实现方式:set 的内部实现是一个value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。
5、zset
适用场景:与set唯一的区别就是有序,如果需要存储一个列表希望没有重复数据且有序,则可以使用。
实现方式:zset的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。
6、Redis HyperLogLog
用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近2^64个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
二、redis支持数据结构的基本操作
1、String
- jedis.set(“key1”, “value1”); //设置键值
- jedis.get(“key1”); //通过键获取值
- jedis.delete(“key1”); //通过key删除值
- jedis.getSet(“key2”, “new_value2”);//通过key设置新值并返回旧值
- jedis.getrange(“key2”, 0, 3);//通过key截取值的部分
- jedis.append(“key2”, “_app”); //通过key拼接字符串,并返回新的长度
- jedis.incr(“key”);//redis自增,如果不存在则赋值为1,如果存在则加一
- jedis.incrBy(“key”,2);//针对key增加响应的值
- jedis.decr(“key”);redis递减,如果不存在则赋值-1,存在则减一
- jedis.decrBy(“key”,2);//针对key减去相应的值
2、Hash
- jedis.hset(“key1”,“field”,“value”);//设置key及对应的field和value
- jedis.hget(“key1”,“field”);//通过key及field获取value,返回值为String
- jedis.hexists(“key1”,“field”);//通过key及field判断是否存在缓存
- jedis.hgetAll(“key1”);//通过key获取所有的field及value,返回值为Map<String,String>
- jedis.hincrBy(“key1”,“field”,2);//通过key以及field增加相应的值
- jedis.hvals(“key1”);//获取key中对应的所有value
- jedis.hkeys(“key1”);//获取key中对应的所有field值
- jedis.hmget(“key1”,“field”);//通过key及field获取value,返回值为List
- jedis.hdel(“key1”,“field”);//删除缓存
3、List
- jedis.lpush(“key”,“value”); //从左边往链表push值
- jedis.rpush(“key”,“value”);//从右边往链表push值
- jedis.lindex(“key”,0);//取从左边开始下标为0的数据
- jedis.llen(‘key’);//获取链表的长度
- jedis.lpop(“key”);//删除左边第一个元素
- jedis.rpop(“key”);//删除右边第一个元素
- jedis.linsert(“key”, Client.LIST_POSITION.BEFORE,“value1”,“value2”);//在value1前面插入value2
- jedis.linsert(“key”, Client.LIST_POSITION.AFTER,“value1”,“value2”);//在value1后面插入value2
- jedis.lrange(“key”,index1,index2);//获取下标index1到index2的数据
- jedis.lrem(“key”,2,“value”);//删除两个值为value的成员
- jedis.lset(“key”,1,“value”);//将下标为1的值置为value
4、Set
- jedis.sadd(“key”,“value1”,“value2”);//往set列表添加值
- jedis.scard(“key”);//查看集合长度
- jedis.sdiff(“key1”, “key2”);//查看两个集合中的差集
- jedis.sdiffstore(“newKey”, “key1”, “key2”);//将两个集合中的差集保存到新的集合中
- jedis.sinter(“key1”, “key2”);//查看两个集合中的并集
- jedis.sinterstore(“newKey”, “key1”, “key2”);//将两个集合中的并集保存到新的集合
- jedis.sismember(“key”, “value”);//查看集合中是否存在value
- jedis.smembers(“key”);//获取key集合中所有的value
5、Zset
- jedis.zadd(“key”,score,“value”);//添加元素,并设置分值
- jedis.zcard(“key”);//得到集合中的元素数量
- jedis.zcount(“key”,score1,score2);//得到分值在这个区间的元素数量
- jedis.zrange(“key”,1,3);//截取下标范围的value值
- jedis.zrangeByScore(“key”,0,-1);取集合中所有数据并按score排序
- jedis.zrem(“key”,“member”);//删除指定成员
6、HyperLogLog
- jedis.pfadd(“key”,“value1”,“value2”);//添加指定元素到 HyperLogLog 中
- jedis.pfcount(“key”);//返回指定基数
- jedis.pfmerge(“newkey”,“key1”,“key2”);//合并多个 HyperLogLog,并将其保存在 desKey 中