只需5分钟,完成Redis所有命令操作~
wptr33 2024-12-31 15:03 34 浏览
常见的面试题:redis可以存储哪些类型的数据结构?
我在做模拟面试中发现,大部分人根本就没用过Redis,答案基本靠背。
能去背,肯定是好事,证明你对面试还挺上进。
但,我们为什么不能快速看看这些数据结构是如何操作的呢?
也许,你看完这些相关操作后对你的背效果会更好。
Redis存储的是key-value结构的数据,其中key是字符串类型,value数据类型有:
- 字符串 string
- 哈希 hash
- 列表 list
- 集合 set
- 有序集合 sorted set / zset
- (地理空间)特殊类型 GeoSpatial
- 超级基数统计 HyperLogLog
- 位图 BitMap
在pom.xml中引入依赖(redis的java客户端之一Jedis):
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.4.3</version>
</dependency>
获取redis连接:
Jedis jedis = new Jedis("localhost", 6379);
string 操作
设置一个字符串键值对:
jedis.set("key", "value");
获取一个字符串键的值:
String value = jedis.get("key");
获取多个字符串键的值:
List<String> values = jedis.mget("key1", "key2", "key3");
批量设置多个字符串键值对:
Map<String, String> keyValuePairs = new HashMap<>();
keyValuePairs.put("key1", "value1");
keyValuePairs.put("key2", "value2");
jedis.mset(keyValuePairs);
批量获取多个字符串键的值:
List<String> values = jedis.mget("key1", "key2", "key3");
获取字符串的长度:
long length = jedis.strlen("key");
在键的值后面追加字符串:
jedis.append("key", "appendValue");
获取字符串的子串:
String substring = jedis.getrange("key", start, end);
设置字符串的新值,并返回旧值:
String oldValue = jedis.getSet("key", "newValue");
设置字符串的新值,并指定过期时间(单位:秒):
jedis.setex("key", seconds, "value");
设置字符串的新值,并指定过期时间(单位:毫秒):
jedis.psetex("key", milliseconds, "value");
如果键不存在,则设置字符串的值:
jedis.setnx("key", "value");
同时设置多个字符串键值对,如果有任何一个键已经存在,则操作不执行:
Map<String, String> keyValuePairs = new HashMap<>();
keyValuePairs.put("key1", "value1");
keyValuePairs.put("key2", "value2");
jedis.msetnx(keyValuePairs);
对字符串键的值进行自增操作:
jedis.incr("key");
对字符串键的值进行自增操作,并指定增加的步长:
jedis.incrBy("key", increment);
对字符串键的值进行浮点数自增操作,并指定增加的步长:
jedis.incrByFloat("key", increment);
对字符串键的值进行自减操作:
jedis.decr("key");
对字符串键的值进行自减操作,并指定减少的步长:
jedis.decrBy("key", decrement);
对字符串键的值进行浮点数自减操作,并指定减少的步长:
jedis.decrByFloat("key", decrement);
对字符串键的值进行位操作,并指定操作类型(AND、OR、XOR、NOT)和另一个字符串键的值:
jedis.bitop(BitOP op, String destKey, String... srcKeys);
对字符串键的值进行位操作,并指定操作类型(AND、OR、XOR、NOT)和位操作的结果保存的新键:
jedis.bitop(BitOP op, String destKey, String... srcKeys);
对字符串键的值进行位操作,并指定操作类型(AND、OR、XOR、NOT)和另一个字符串键的值,并返回操作结果的字符串表示:
String result = jedis.bitop(BitOP op, String destKey, String... srcKeys);
获取字符串键的位图中指定位的值:
boolean bitValue = jedis.getbit("key", offset);
设置字符串键的位图中指定位的值:
boolean previousBitValue = jedis.setbit("key", offset, bitValue);
获取字符串键的位图中指定范围内的位的值:
BitSet bitSet = jedis.getrangebit("key", start, end);
设置字符串键的位图中指定范围内的位的值:
long numberOfBitsSet = jedis.setrangebit("key", offset, "bitSet");
删除一个字符串键:
long numberOfDeletedKeys = jedis.del("key");
删除多个字符串键:
long numberOfDeletedKeys = jedis.del("key1", "key2", "key3");
请注意,上述代码中的"key"和"value"应替换为实际的键和值。
hash操作
HSET命令:将哈希表key中的字段field的值设为value。
jedis.hset("myhash", "field1", "value1");
HGET命令:获取哈希表key中给定字段field的值。
Jedis jedis = new Jedis("localhost");
String value = jedis.hget("myhash", "field1");
System.out.println(value);
HMSET命令:同时将多个field-value(域-值)对设置到哈希表key中。
Jedis jedis = new Jedis("localhost");
Map<String, String> hash = new HashMap<>();
hash.put("field1", "value1");
hash.put("field2", "value2");
jedis.hmset("myhash", hash);
HMGET命令:获取哈希表key中,一个或多个给定字段的值。
Jedis jedis = new Jedis("localhost");
List<String> values = jedis.hmget("myhash", "field1", "field2");
for (String value : values) {
System.out.println(value);
}
HGETALL命令:获取哈希表key中的所有字段和值。
Jedis jedis = new Jedis("localhost");
Map<String, String> hash = jedis.hgetAll("myhash");
for (Map.Entry<String, String> entry : hash.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
HDEL命令:删除哈希表key中的一个或多个指定字段。
Jedis jedis = new Jedis("localhost");
Long result = jedis.hdel("myhash", "field1");
System.out.println(result);
这些示例代码只是演示了一些常见的hash命令操作,你可以根据需要使用其他hash命令,并根据具体情况处理返回结果。
list操作
下面是使用Java实现Redis中所有List相关命令操作的示例代码:
LPUSH命令:将一个或多个值插入到列表的头部
jedis.lpush("listKey", "value1", "value2", "value3");
RPUSH命令:将一个或多个值插入到列表的尾部
jedis.rpush("listKey", "value4", "value5", "value6");
LLEN命令:获取列表的长度
Long length = jedis.llen("listKey");
LPOP命令:移除并返回列表的头部元素
String element = jedis.lpop("listKey");
RPOP命令:移除并返回列表的尾部元素
String element = jedis.rpop("listKey");
LINDEX命令:通过索引获取列表中的元素
String element = jedis.lindex("listKey", 2);
LRANGE命令:获取列表中指定范围内的元素
List<String> elements = jedis.lrange("listKey", 0, -1);
LREM命令:从列表中移除指定数量的元素
Long count = jedis.lrem("listKey", 2, "value");
LSET命令:通过索引设置列表中的元素
jedis.lset("listKey", 0, "newValue");
LINSERT命令:在列表中指定元素的前面或后面插入新元素
jedis.linsert("listKey", ListPosition.BEFORE, "existingValue", "newValue");
LTRIM命令:截取列表中指定范围的元素
jedis.ltrim("listKey", 0, 2);
注意:以上代码中的"listKey"为列表的键名,根据实际情况进行替换。
set操作
以下是使用Java实现Redis中所有set相关的命令操作的示例代码:
import redis.clients.jedis.Jedis;
import java.util.List;
import java.util.Set;
public class RedisSetCommands {
public static void main(String[] args) {
// 连接Redis服务器
Jedis jedis = new Jedis("localhost");
// 添加元素到集合
jedis.sadd("set1", "element1", "element2", "element3");
// 获取集合中的所有元素
Set<String> set1 = jedis.smembers("set1");
System.out.println("set1: " + set1);
// 判断元素是否存在于集合中
boolean exists = jedis.sismember("set1", "element1");
System.out.println("element1 exists in set1: " + exists);
// 获取集合的元素数量
long size = jedis.scard("set1");
System.out.println("set1 size: " + size);
// 从集合中随机获取一个元素
String randomElement = jedis.srandmember("set1");
System.out.println("Random element from set1: " + randomElement);
// 从集合中移除指定的元素
jedis.srem("set1", "element2");
// 获取集合的差集
jedis.sadd("set2", "element2", "element4");
Set<String> difference = jedis.sdiff("set1", "set2");
System.out.println("Difference between set1 and set2: " + difference);
// 获取集合的交集
Set<String> intersection = jedis.sinter("set1", "set2");
System.out.println("Intersection of set1 and set2: " + intersection);
// 获取集合的并集
Set<String> union = jedis.sunion("set1", "set2");
System.out.println("Union of set1 and set2: " + union);
// 将集合的元素移动到另一个集合
jedis.smove("set1", "set2", "element3");
// 获取多个集合的并集并存储到新集合中
jedis.sunionstore("set3", "set1", "set2");
Set<String> set3 = jedis.smembers("set3");
System.out.println("set3: " + set3);
// 获取多个集合的交集并存储到新集合中
jedis.sinterstore("set4", "set1", "set2");
Set<String> set4 = jedis.smembers("set4");
System.out.println("set4: " + set4);
// 获取多个集合的差集并存储到新集合中
jedis.sdiffstore("set5", "set1", "set2");
Set<String> set5 = jedis.smembers("set5");
System.out.println("set5: " + set5);
// 关闭Redis连接
jedis.close();
}
}
sort set操作
以下是使用Java实现Redis中所有sorted set相关的命令操作的示例代码:
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Tuple;
import redis.clients.jedis.ZParams;
import java.util.Map;
import java.util.Set;
public class RedisSortedSetExample {
public static void main(String[] args) {
// 创建连接
Jedis jedis = new Jedis("localhost", 6379);
// 添加元素到有序集合
jedis.zadd("myset", 1, "one");
jedis.zadd("myset", 2, "two");
jedis.zadd("myset", 3, "three");
// 获取有序集合的成员数量
long count = jedis.zcard("myset");
System.out.println("Count: " + count);
// 获取指定元素的分数
double score = jedis.zscore("myset", "two");
System.out.println("Score: " + score);
// 增加指定元素的分数
jedis.zincrby("myset", 2, "two");
// 获取有序集合中指定范围的成员
Set<String> range = jedis.zrange("myset", 0, -1);
System.out.println("Range: " + range);
// 获取有序集合中指定分数范围的成员
Set<String> rangeByScore = jedis.zrangeByScore("myset", 1, 3);
System.out.println("Range by score: " + rangeByScore);
// 获取有序集合中指定分数范围的成员和分数
Set<Tuple> rangeByScoreWithScores = jedis.zrangeByScoreWithScores("myset", 1, 3);
for (Tuple tuple : rangeByScoreWithScores) {
System.out.println("Member: " + tuple.getElement() + ", Score: " + tuple.getScore());
}
// 获取有序集合中指定成员的排名(从0开始)
long rank = jedis.zrank("myset", "two");
System.out.println("Rank: " + rank);
// 获取有序集合中指定成员的排名(从1开始)
long reverseRank = jedis.zrevrank("myset", "two");
System.out.println("Reverse rank: " + reverseRank);
// 移除指定成员
jedis.zrem("myset", "two");
// 获取有序集合中指定范围排名的成员
Set<String> rangeByRank = jedis.zrange("myset", 0, -1);
System.out.println("Range by rank: " + rangeByRank);
// 获取有序集合中指定范围排名的成员和分数
Set<Tuple> rangeByRankWithScores = jedis.zrangeWithScores("myset", 0, -1);
for (Tuple tuple : rangeByRankWithScores) {
System.out.println("Member: " + tuple.getElement() + ", Score: " + tuple.getScore());
}
// 获取有序集合中指定范围内的成员数量
long rangeCount = jedis.zcount("myset", 1, 3);
System.out.println("Range count: " + rangeCount);
// 获取有序集合中指定成员的分数范围内的成员数量
long rangeByScoreCount = jedis.zcount("myset", "(" + 1, "(" + 3);
System.out.println("Range by score count: " + rangeByScoreCount);
// 获取有序集合中指定成员的分数范围内的成员数量(包括边界值)
long rangeByScoreCountInclusive = jedis.zcount("myset", 1, 3);
System.out.println("Range by score count inclusive: " + rangeByScoreCountInclusive);
// 使用ZParams设置有序集合操作的参数
ZParams params = new ZParams();
params.aggregate(ZParams.Aggregate.MAX);
params.weightsByDouble(2, 3);
// 执行有序集合的交集操作,并将结果存储到新的有序集合
jedis.zinterstore("newset", params, "myset1", "myset2");
// 获取新的有序集合中指定范围的成员
Set<String> newSetRange = jedis.zrange("newset", 0, -1);
System.out.println("New set range: " + newSetRange);
// 获取新的有序集合中指定范围的成员和分数
Set<Tuple> newSetRangeWithScores = jedis.zrangeWithScores("newset", 0, -1);
for (Tuple tuple : newSetRangeWithScores) {
System.out.println("Member: " + tuple.getElement() + ", Score: " + tuple.getScore());
}
// 关闭连接
jedis.close();
}
}
这个示例代码演示了如何使用Java操作Redis中的sorted set。它包括添加元素、获取成员数量、获取指定元素的分数、增加指定元素的分数、获取指定范围的成员、获取指定范围分数的成员、获取成员的排名、移除指定成员、获取指定范围排名的成员数量等操作。还演示了如何使用ZParams设置参数并执行交集操作。请根据自己的实际需求进行修改和扩展。
GeoSpatial 操作
以下是一些常用的GeoSpatial命令操作的示例:
添加地理位置:
Jedis jedis = new Jedis("localhost", 6379);
jedis.geoadd("locations", 116.397128, 39.916527, "Beijing");
jedis.geoadd("locations", 121.473701, 31.230416, "Shanghai");
获取地理位置的经纬度:
List<GeoCoordinate> coordinates = jedis.geopos("locations", "Beijing", "Shanghai");
for (GeoCoordinate coordinate : coordinates) {
System.out.println("Longitude: " + coordinate.getLongitude());
System.out.println("Latitude: " + coordinate.getLatitude());
}
计算两个地理位置之间的距离:
double distance = jedis.geodist("locations", "Beijing", "Shanghai", GeoUnit.KM);
System.out.println("Distance: " + distance + " km");
获取指定地理位置附近的其他地理位置:
List<GeoRadiusResponse> nearbyLocations = jedis.georadius("locations", 116.397128, 39.916527, 200, GeoUnit.KM);
for (GeoRadiusResponse location : nearbyLocations) {
System.out.println("Location: " + location.getMemberByString());
System.out.println("Distance: " + location.getDistance());
}
这些示例展示了如何在Java中使用Jedis库实现Redis中的GeoSpatial命令操作。你可以根据需要进行调整和扩展。
HyperLogLog 操作
以下代码来实现HyperLogLog相关的命令操作:
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
import redis.clients.jedis.Response;
public class HyperLogLogExample {
public static void main(String[] args) {
// 连接到Redis服务器
Jedis jedis = new Jedis("localhost", 6379);
// 添加元素到HyperLogLog
jedis.pfadd("hll_key", "element1", "element2", "element3");
// 获取HyperLogLog的基数
Long count = jedis.pfcount("hll_key");
System.out.println("基数为: " + count);
// 使用Pipeline批量执行HyperLogLog命令
Pipeline pipeline = jedis.pipelined();
Response<Long> response1 = pipeline.pfadd("hll_key2", "element4", "element5");
Response<Long> response2 = pipeline.pfcount("hll_key2");
pipeline.sync();
Long count2 = response2.get();
System.out.println("基数为: " + count2);
// 关闭Redis连接
jedis.close();
}
}
在上面的代码中,我们首先通过jedis.pfadd命令将元素添加到HyperLogLog中,并使用jedis.pfcount命令获取HyperLogLog的基数。接下来,我们使用Pipeline来批量执行HyperLogLog命令,以提高性能。
BitMap 操作
下面是一些常见的BitMap命令操作的示例:
设置指定位的值:
// 设置第5个位的值为1
jedis.setbit("mybitmap", 5, true);
获取指定位的值:
Jedis jedis = new Jedis("localhost");
// 获取第5个位的值
boolean bitValue = jedis.getbit("mybitmap", 5);
统计指定范围内值为1的位的数量:
Jedis jedis = new Jedis("localhost");
// 统计mybitmap中值为1的位的数量
long bitCount = jedis.bitcount("mybitmap");
对多个BitMap进行逻辑运算(AND、OR、XOR、NOT):
Jedis jedis = new Jedis("localhost");
// 对多个BitMap进行OR运算,并将结果保存到新的BitMap中
jedis.bitop(BitOP.OR, "result", "bitmap1", "bitmap2", "bitmap3");
获取指定范围内值为1的位的位置:
Jedis jedis = new Jedis("localhost");
// 获取mybitmap中值为1的位的位置,从偏移量为0开始,最多返回10个结果
List<Long> bitPos = jedis.bitpos("mybitmap", true, new BitPosParams(0, 10));
这些是一些常见的BitMap相关的命令操作,你可以根据需要进行相应的调用和处理。
Redis使用场景
学完这些操作命令后,再来看看Redis的场景使用场景:
- 缓存
- 分布式锁
- 全局id
- 计数器
- 限流
- 位统计
- 购物车
- 消息队列
- 点赞
- 签到
- 打卡
- 排行榜
- 商品标签
- 商品筛选
- 用户关注
- ....
另外,本文中使用的是Jedis客户端,关于java的redis客户端有很多,我们下次再来聊这个话题。
相关推荐
- 开发者必看的八大Material Design开源项目
-
MaterialDesign是介于拟物和扁平之间的一种设计风格,自从它发布以来,便引起了很多开发者的关注,在这里小编介绍在Android开发者当中里最受青睐的八个MaterialDesign开源项...
- 另类插这么可爱,一定是…(另类t恤)
-
IT之家(www.ithome.com):另类插图:这么可爱,一定是…OSXMavericks和Yosemite打破了苹果对Mac操作系统传统的命名方式,使用加州的某些标志性景点来替换猫...
- Android常用ADB命令(安卓adb工具是什么)
-
杀死应用①根据包名获取APP的PIDadbshellps|grep应用包名②执行kill命令...
- 微软Mac版PowerPoint测试Reading Order Pane功能
-
IT之家5月20日消息,微软公司昨日(5月19日)发布博文,邀请Microsoft365Insiders成员,测试macOS新版PowerPoint演示文稿应用,重点引入...
- Visual Studio跨平台开发实战(4):Xamarin Android控制项介绍
-
前言不同于iOS,Xamarin在VisualStudio中针对Android,可以直接设计使用者界面.在本篇教学文章中,笔者会针对Android的专案目录结构以及基本控制项进行介绍,包...
- 用云存储30分钟快速搭建APP,你信吗?
-
背景不管你承认与否,移动互联的时代已经到来,这是一个移动互联的时代,手机已经是当今世界上引领潮流的趋势,大型的全球化企业和中小企业都把APP程序开发纳入到他们的企业发展策略当中。但随着手机APP上传的...
- 谷歌P图神器来了!不用学不用教,输入一句话,分分钟给结果
-
Pine发自凹非寺量子位|公众号QbitAI当你拍照片时,“模特不好好配合”怎么办?...
- iOS文本编辑控件UITextField和UITextVie
-
记录一个菜鸟的IOS学习之旅,如能帮助正在学习的你,亦枫不胜荣幸;如路过的大神如指教几句,亦枫感激涕淋!细心的朋友可能已经注意到了,IOS学习之旅系列教程在本篇公众号的文章中,封面已经换成美女图片了,...
- Android入门图文教程集锦(android 入门教程)
-
Android入门视频教程集锦AndroidStudio错误gradientandroid:endXattributenotfound...
- 如何使用Android自定义复合视图(如何使用android自定义复合视图)
-
在最近的一个客户应用中,我遇到了一个需求,根据选定的值来生成指定数量的编辑框字段,这样用户可以输入人物信息。最初我的想法是把这些逻辑放到Fragment中,只是根据选中值的变化来向线性布局容器中增加编...
- 原生安卓开发app的框架frida常用关键代码定位
-
前言有时候可能会对APP进行字符串加密等操作,这样的话你的变量名等一些都被混淆了,看代码就可能无从下手...
- 教程10 | 三分钟搞定一个智能输入法程序
-
一案例描述1、考核知识点网格布局线性布局样式和主题Toast2、练习目标掌握网格布局的使用掌握Toast的使用掌握线性布局的使用...
- (Android 8.1) 功能与新特性(android的功能)
-
和你一起终身学习,这里是程序员AndroidAndroid8.1(API级别27)为用户和开发人员引入了各种新特性和功能。本文档重点介绍了开发人员的新功能。通过本章阅读,您将获取到以下内容:Andr...
- 怎样设置EditText内部文字被锁定不可删除和修改
-
在做项目的时候,我曾经遇到过这样的要求,就是跟百度贴吧客户端上的一样,在回复帖子的时候,在EditText中显示回复人的名字,而且这个名字不可以修改和删除,说白了就是不可操作,只能在后面输入内容。在E...
- 如何阻止 Android 活动启动时 EditText 获得焦点
-
技术背景在Android开发中,当活动启动时,EditText有时会自动获得焦点并弹出虚拟键盘,这可能不是用户期望的行为。为了提升用户体验,我们需要阻止...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
因果推断Matching方式实现代码 因果推断模型
-
git pull命令使用实例 git pull--rebase
-
面试官:git pull是哪两个指令的组合?
-
git 执行pull错误如何撤销 git pull fail
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
git pull 之后本地代码被覆盖 解决方案
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git命令之pull git.pull
-
- 最近发表
-
- 开发者必看的八大Material Design开源项目
- 另类插这么可爱,一定是…(另类t恤)
- Android常用ADB命令(安卓adb工具是什么)
- 微软Mac版PowerPoint测试Reading Order Pane功能
- Visual Studio跨平台开发实战(4):Xamarin Android控制项介绍
- 用云存储30分钟快速搭建APP,你信吗?
- 谷歌P图神器来了!不用学不用教,输入一句话,分分钟给结果
- iOS文本编辑控件UITextField和UITextVie
- Android入门图文教程集锦(android 入门教程)
- 如何使用Android自定义复合视图(如何使用android自定义复合视图)
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)