redis的常见数据类型和应用场景(非八股)------大总结(学了要会用-------教你如何使用)
Redis的数据类型
Redis 提供了丰富的数据类型,常见的有五种:
String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合)。
应用场景:学了如何用?
请看下面解析:
1. String(字符串):
应用场景: 存储单一值,例如计数器;
格式:
格式:SET key value
示例:SET username john_doe
常见命令:
// 设置字符串值
jedis.set("key", "value");// 获取字符串值
String result = jedis.get("key");
//递增计数器:
INCR key
String如何实现计数器?
// 导入 Jedis 类库,用于与 Redis 交互
import redis.clients.jedis.Jedis;// 定义一个名为 CounterExample 的 Java 类
public class CounterExample {// 主程序入口public static void main(String[] args) {// 创建 Jedis 对象,连接到本地 Redis 服务Jedis jedis = new Jedis("localhost", 6379);// 指定计数器的键名String counterKey = "pageviews:homepage";// 模拟每次访问主页时调用计数器incrementCounter(jedis, counterKey);incrementCounter(jedis, counterKey);incrementCounter(jedis, counterKey);// 获取当前计数器的值long pageviews = getCounterValue(jedis, counterKey);System.out.println("Pageviews: " + pageviews);// 关闭连接jedis.close();}// 定义一个方法,使用 INCR 命令递增计数器private static void incrementCounter(Jedis jedis, String counterKey) {jedis.incr(counterKey);}// 定义一个方法,获取计数器的值private static long getCounterValue(Jedis jedis, String counterKey) {// 通过键名获取计数器的值(返回字符串形式)String counterValue = jedis.get(counterKey);// 将字符串形式的计数器值转换为 long 类型return Long.parseLong(counterValue);}
}
2、Hash(哈希)
格式:
格式:HSET key field value
示例:HSET user:1001 username john_doe
应用场景: 存储对象属性:用户信息存储。
将每个用户的信息存储为一个 Hash,其中 Hash 的键是用户ID,字段是用户属性(如用户名、邮箱、年龄等),值是对应的属性值。
HSET user:1001 username john_doe
HSET user:1001 email john_doe@example.com
HSET user:1001 age 25
Java代码:
// 设置哈希字段值
jedis.hset("hashKey", "field1", "value1");// 获取哈希字段值
String result = jedis.hget("hashKey", "field1");// 获取所有哈希字段值
Map<String, String> allFields = jedis.hgetAll("hashKey");
Hash如何实现存储对象属性?
// 导入 Jedis 类库,用于与 Redis 交互
import redis.clients.jedis.Jedis;// 定义一个名为 HashExample 的 Java 类
public class HashExample {// 主程序入口public static void main(String[] args) {// 创建 Jedis 对象,连接到本地 Redis 服务Jedis jedis = new Jedis("localhost", 6379);// 指定哈希的键名String hashKey = "user:1001";// 模拟存储用户对象属性setHashField(jedis, hashKey, "username", "john_doe");setHashField(jedis, hashKey, "email", "john_doe@example.com");// 获取用户对象的所有属性Map<String, String> userAttributes = getHashFields(jedis, hashKey);System.out.println("User Attributes: " + userAttributes);// 关闭连接jedis.close();}// 定义一个方法,设置哈希字段值private static void setHashField(Jedis jedis, String hashKey, String field, String value) {jedis.hset(hashKey, field, value);}// 定义一个方法,获取哈希字段值private static Map<String, String> getHashFields(Jedis jedis, String hashKey) {// 通过键名获取哈希的所有字段值return jedis.hgetAll(hashKey);}
}
3、List(列表)
List 类型常用命令:
//从左边插入元素:
LPUSH key element
//从右边弹出元素:
RPOP key
//获取列表范围元素:
LRANGE key start stop
应用场景:存储一系列有序的元素,适用于队列、栈等场景。
Java代码:
// 在列表左侧插入元素
jedis.lpush("tasks", "Task 1");
jedis.lpush("tasks", "Task 2");// 获取列表所有元素
List<String> allTasks = jedis.lrange("tasks", 0, -1);
System.out.println("All Tasks: " + allTasks);
List 如何实现存储有序元素?
// 导入 Jedis 类库,用于与 Redis 交互
import redis.clients.jedis.Jedis;// 定义一个名为 ListExample 的 Java 类
public class ListExample {// 主程序入口public static void main(String[] args) {// 创建 Jedis 对象,连接到本地 Redis 服务Jedis jedis = new Jedis("localhost", 6379);// 指定列表的键名String listKey = "tasks";// 模拟任务队列操作pushTask(jedis, listKey, "Task 3");pushTask(jedis, listKey, "Task 4");popTask(jedis, listKey);// 获取所有任务List<String> allTasks = getAllTasks(jedis, listKey);System.out.println("All Tasks: " + allTasks);// 关闭连接jedis.close();}// 定义一个方法,左侧插入任务private static void pushTask(Jedis jedis, String listKey, String task) {jedis.lpush(listKey, task);}// 定义一个方法,右侧弹出任务private static void popTask(Jedis jedis, String listKey) {jedis.rpop(listKey);}// 定义一个方法,获取所有任务private static List<String> getAllTasks(Jedis jedis, String listKey) {// 获取列表的所有元素return jedis.lrange(listKey, 0, -1);}
}
在这个示例中,LPUSH
命令用于在列表左侧插入新任务,RPOP
命令用于右侧弹出已完成的任务。通过这些操作,我们可以实现一个简单的任务队列。
Set(集合)
常见命令:
//添加元素到集合:
SADD key member
//获取集合所有成员:
SMEMBERS key
//计算集合大小:
SCARD key
**应用场景:**存储不重复的元素,适用于需要确保元素唯一性的场景:模拟一个社交网络系统中用户的关注列表,使用集合存储用户关注的其他用户。
SADD following:user1 user2 user3
Java代码:
// 将元素添加到集合
jedis.sadd("following:user1", "user2", "user3");// 获取集合所有元素
Set<String> followingList = jedis.smembers("following:user1");
System.out.println("Following List: " + followingList);
SET 如何实现存储不重复元素?
// 导入 Jedis 类库,用于与 Redis 交互
import redis.clients.jedis.Jedis;import java.util.Set;// 定义一个名为 SetExample 的 Java 类
public class SetExample {// 主程序入口public static void main(String[] args) {// 创建 Jedis 对象,连接到本地 Redis 服务Jedis jedis = new Jedis("localhost", 6379);// 指定集合的键名String setKey = "following:user1";// 模拟用户关注操作addUserToFollowing(jedis, setKey, "user2");addUserToFollowing(jedis, setKey, "user3");// 获取用户关注列表Set<String> followingList = getUserFollowing(jedis, setKey);System.out.println("Following List: " + followingList);// 关闭连接jedis.close();}// 定义一个方法,将用户添加到关注列表private static void addUserToFollowing(Jedis jedis, String setKey, String user) {jedis.sadd(setKey, user);}// 定义一个方法,获取用户关注列表private static Set<String> getUserFollowing(Jedis jedis, String setKey) {// 获取集合的所有元素return jedis.smembers(setKey);}
}
在这个示例中,SADD命令用于将元素添加到集合,确保集合中的元素是唯一的。通过这些操作,我们可以实现一个用户的关注列表,保证每个用户只能关注其他用户一次。
5、Zset(有序集合)
Zset 类型常用命令:
添加元素到有序集合:
ZADD key score member
获取有序集合的排名:
ZRANK key member
获取有序集合范围元素:
ZRANGE key start stop
**应用场景:**存储带有分数的元素,适用于需要按照分数排序的场景:模拟一个在线排行榜
模拟一个在线排行榜,使用有序集合存储用户分数,并通过分数从高到低排列:
ZADD leaderboard 100 user1 150 user2 80 user3
Java代码:
// 将带有分数的元素添加到有序集合
jedis.zadd("leaderboard", 100, "user1");
jedis.zadd("leaderboard", 150, "user2");
jedis.zadd("leaderboard", 80, "user3");// 获取有序集合的排行榜
Set<String> leaderboard = jedis.zrevrange("leaderboard", 0, -1);
System.out.println("Leaderboard: " + leaderboard);
ZSET 如何实现存储带有分数的元素?
// 导入 Jedis 类库,用于与 Redis 交互
import redis.clients.jedis.Jedis;import java.util.Set;// 定义一个名为 ZSetExample 的 Java 类
public class ZSetExample {// 主程序入口public static void main(String[] args) {// 创建 Jedis 对象,连接到本地 Redis 服务Jedis jedis = new Jedis("localhost", 6379);// 指定有序集合的键名String zsetKey = "leaderboard";// 模拟在线排行榜操作addUserScore(jedis, zsetKey, "user1", 100);addUserScore(jedis, zsetKey, "user2", 150);addUserScore(jedis, zsetKey, "user3", 80);// 获取在线排行榜Set<String> leaderboard = getLeaderboard(jedis, zsetKey);System.out.println("Leaderboard: " + leaderboard);// 关闭连接jedis.close();}// 定义一个方法,添加带有分数的元素到有序集合private static void addUserScore(Jedis jedis, String zsetKey, String user, double score) {jedis.zadd(zsetKey, score, user);}// 定义一个方法,获取有序集合的排行榜private static Set<String> getLeaderboard(Jedis jedis, String zsetKey) {// 获取有序集合按照分数从高到低的排行榜return jedis.zrevrange(zsetKey, 0, -1);// 0:起始排名,表示从排名第一开始。// -1:结束排名,表示获取所有元素,没有限制。}
}