在redis的db存在大量key或者db里头的某个set、zset、hash里头的元素非常多的话,用普通的get all操作很可能导致redis因为这个操作阻塞了,导致不能响应其他操作,特别是在高并发、海量数据的背景下,这个问题显得尤其严重。那么能不能像数据库那样有个分页的功能呢,答案就是scan操作。本文主要展示怎么在redis-cli以及springdataredis中的使用。【推荐:redis视频教程】 scan之后返回两部分,第一部分是下次scan的参数,第二部分就是scan出来的项redis系列
序
scan语法
作用对象(db、set、zset、hash)
key)127.0.0.1:6379> scan 0
1) "120"
2) 1) "articleMap:63"
2) "articleMap:37"
3) "counter:__rand_int__"
4) "articleMap:60"
5) "tagSet:tag5"
6) "articleMap:80"
7) "messageCache~keys"
8) "mymap"
9) "articleMap:46"
10) "articleMap:55"
127.0.0.1:6379> scan 120
1) "28"
2) 1) "articleMap:17"
2) "tagSet:tag1"
3) "articleMap:18"
4) "articleMap:81"
5) "\xac\xed\x00\x05t\x00\btest-cas"
6) "articleMap:51"
7) "articleMap:94"
8) "articleMap:26"
9) "articleMap:71"
10) "user-abcde"value)127.0.0.1:6379> sscan myset 0
1) "3"
2) 1) "m"
2) "j"
3) "c"
4) "h"
5) "f"
6) "i"
7) "a"
8) "g"
9) "n"
10) "e"
11) "b"
127.0.0.1:6379> sscan myset 3
1) "0"
2) 1) "l"
2) "k"
3) "d"value & score)127.0.0.1:6379> zscan sortset 0
1) "0"
2) 1) "tom"
2) "89"
3) "jim"
4) "90"
5) "david"
6) "100"
key & value)127.0.0.1:6379> hscan mymap 0
1) "0"
2) 1) "name"
2) "codecraft"
3) "email"
4) "pt@g.cn"
5) "age"
6) "20"
7) "desc"
8) "hello"
9) "sex"
10) "male"SCAN的额外参数
指定每次取多少条)127.0.0.1:6379> scan 0 count 5
1) "240"
2) 1) "articleMap:63"
2) "articleMap:37"
3) "counter:__rand_int__"
4) "articleMap:60"
5) "tagSet:tag5"
匹配key)127.0.0.1:6379> scan 0 match article*
1) "120"
2) 1) "articleMap:63"
2) "articleMap:37"
3) "articleMap:60"
4) "articleMap:80"
5) "articleMap:46"
6) "articleMap:55"
RedisTemplate操作
遍历数据库key
@Test
public void scanDbKeys(){
template.execute(new RedisCallback<Iterable<byte[]>>() {
@Override
public Iterable<byte[]> doInRedis(RedisConnection connection) throws DataAccessException {
List<byte[]> binaryKeys = new ArrayList<byte[]>();
Cursor<byte[]> cursor = connection.scan(ScanOptions.scanOptions().count(5).build());
while (cursor.hasNext()) {
byte[] key = cursor.next();
binaryKeys.add(key);
System.out.println(new String(key, StandardCharsets.UTF_8));
}
try {
cursor.close();
} catch (IOException e) {
// do something meaningful
}
return binaryKeys;
}
});
}遍历set
/**
* sadd myset a b c d e f g h i j k l m n
*/
@Test
public void scanSet(){
Cursor<String> cursor = template.opsForSet().scan("myset",ScanOptions.NONE);
while (cursor.hasNext()){
System.out.println(cursor.next());
}
}遍历zset
/**
* zadd sortset 89 tom 90 jim 100 david
*/
@Test
public void scanZSet(){
Cursor<ZSetOperations.TypedTuple<String>> cursor = template.opsForZSet().scan("sortset",ScanOptions.NONE);
while (cursor.hasNext()){
ZSetOperations.TypedTuple<String> item = cursor.next();
System.out.println(item.getValue() + ":" + item.getScore());
}
}遍历hash
/**
* hset mymap name "codecraft"
* hset mymap email "pt@g.cn"
* hset mymap age 20
* hset mymap desc "hello"
* hset mymap sex "male"
*/
@Test
public void scanHash(){
Cursor<Map.Entry<Object, Object>> curosr = template.opsForHash().scan("mymap", ScanOptions.NONE);
while(curosr.hasNext()){
Map.Entry<Object, Object> entry = curosr.next();
System.out.println(entry.getKey()+":"+entry.getValue());
}
}
0
0
相关文章
redis如何实现排行榜 redis排行榜的5种实现方案
配置Redis防火墙规则的最佳实践
Redis网络带宽瓶颈的检测与优化方法
redis如何避免脏读 redis避免脏读的隔离级别设置
实现Redis数据的原子性操作的方法与场景
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门AI工具
相关专题
Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
203
2023.11.20
常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。
1003
2023.11.02
内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。
669
2023.11.14
redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
501
2024.04.02
redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
412
2024.04.07
redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
407
2024.04.07
确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
478
2024.04.07
redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
424
2024.04.07
本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。
1
2026.03.06
热门下载
相关下载
精品课程

