精华内容
下载资源
问答
  • Redis模糊查询

    千次阅读 2021-02-12 19:24:43
    最近使用Redis优化项目功能,其中有一部分为模糊查询,找了很多帖子,也没有找到很好的解决方案和思路,最终皇天不负有心人啊,终于让我找到了!!!可以通过Redis中keys命令进行获取key值,具体命令格式:keys ...

    最近使用Redis优化项目功能,其中有一部分为模糊查询,找了很多帖子,也没有找到很好的解决方案和思路,最终皇天不负有心人啊,终于让我找到了!!!

    可以通过Redis中keys命令进行获取key值,具体命令格式:keys pattern

    文中提到redis中允许模糊查询的有3个通配符,分别是:*,?,[]

    其中:

    *:通配任意多个字符

    ?:通配单个字符

    []:通配括号内的某一个字符

    =========================================================================

    在实际项目中有可能会使用spring集成redis的RedisTemplate进行操作,这样在注入模板时可能会出现模糊查询不好用的情况,是因为

    keys方法是存在于StringRedisTemplate子类中(父类-RedisTemplate)的

    在spring配置时,一定要注意!!!

    =========================================================================

    实际操作中具体的思路:

    1. 将要查询的条件当做key进行ZSet存储

    2. 在获取时,调用StringRedisTemplate.keys(pattern),例:

    public Set keys(String pattern){

    return stringRedisTemplate.keys("*" + pattern + "*");

    // return stringRedisTemplate.keys("?" + pattern);

    // return stringRedisTemplate.keys("[" + pattern + "]");

    }

    展开全文
  • Redis 存储、查询

    2021-01-19 20:46:00
    info.email.{email} {id1} {id3} {id9} 查询 keys模糊查询 //模糊查询name中含有keywords的记录 keys user_info.name.*keywords* keys 支持正则匹配,但是Redis官网建议不要在prod环境使用这个命令,会降低性能。...

    数据存储

    假设我们在MySQL数据库中有这样一张表:

    mysql> desc user_info;

    Field

    Type

    Null

    Key

    Default

    Extra

    id

    int(11)

    NO

    PRI

    NULL

    auto_increment

    NAME

    varchar(50)

    YES

    NULL

    age

    int(11)

    YES

    NULL

    email

    varchar(50)

    YES

    NULL

    addr

    varchar(100)

    YES

    NULL

    在redis中, 我们希望可以按照name,age,email(组合)查询, 那么我们的redis存储可以这样规划:

    hmset user_info.id.{id} name {name} age {age} email {email} addr {addr}

    索引

    sadd user_info.name.{name} {id1} {id2} {id3}

    sadd user_info.age.{age} {id2} {id4} {id6}

    sadd user_info.email.{email} {id1} {id3} {id9}

    查询

    keys模糊查询

    //模糊查询name中含有keywords的记录

    keys user_info.name.*keywords*

    keys 支持正则匹配,但是Redis官网建议不要在prod环境使用这个命令,会降低性能。

    Warning: consider KEYS as a command that should only be used in production environments with extreme care. It may ruin performance when it is executed against large databases. This command is intended for debugging and special operations, such as changing your keyspace layout. Don't use KEYS in your regular application code. If you're looking for a way to find keys in a subset of your keyspace, consider using SCAN or sets.

    sets查询

    //按name查询

    smembers user_info.name.{name}

    //按age查询

    smembers user_info.age.{age}

    //按email查询

    smembers user_info.email.{email}

    //按name, age组合查询

    sinter user_info.name.{name} user_info.age.{age}

    注意

    上面的查询都是精确 = 查询

    scan查询

    SCAN 迭代当前数据库的key集合.

    SSCAN 迭代指定Sets key集合的元素.

    ZSCAN 迭代指定Sorted Set key集合的元素.

    HSCAN 迭代指定Hash key集合的field/value.

    语法:

    SCAN cursor [MATCH pattern] [COUNT count]

    count 指定返回结果集的数量,默认为10,redis并不能保证每次返回的都是count个结果

    SCAN是基于游标(cursor)的,每次只返回少量的结果集,所以需要不停迭代cursor,只到cursor返回0,

    127.0.0.1:6379> scan 0 count 5

    1) "10" // 下一次迭代cursor的起始position

    2) 1) "Key_6"

    2) "Key_1"

    3) "Key_4"

    4) "Key_10"

    5) "Key_5"

    6) "Key_7" // 我们指定count为5,但返回了6条数据

    127.0.0.1:6379> scan 10 count 5

    1) "11" // 下一次迭代cursor的起始position

    2) 1) "Key_8"

    2) "Key_3"

    3) "Key_11"

    4) "Key_9"

    5) "Key_2"

    127.0.0.1:6379> scan 11 count 5

    1) "0" // 0表示迭代结束

    2) 1) "Key_12"

    Match

    这里需要注意下match执行的过程:

    1, redis执行 scan x COUNT [count]

    2, redis对上面的结果集进行match过滤,然后返回给client端

    这就意味着,如果你使用了match过滤,则绝大多数情况下,client端每次收到的结果集数量都小于你指定的[count]数量。

    // match 正则匹配, 返回含有'1'的key集合

    127.0.0.1:6379> scan 0 count 5 match *1*

    1) "10"

    2) 1) "Key_1"

    2) "Key_10"

    127.0.0.1:6379> scan 10 count 5 match *1*

    1) "11"

    2) 1) "Key_11"

    127.0.0.1:6379> scan 11 count 5 match *1*

    1) "0"

    2) 1) "Key_12"

    // SCAN cursor [MATCH pattern] [COUNT count]

    127.0.0.1:6379> sadd age.22 id_5 id_7 id_9 id_8 id_11 id_12 id_20

    (integer) 7

    127.0.0.1:6379> sscan age.22 0 count 5

    1) "0"

    2) 1) "id_7"

    2) "id_5"

    3) "id_11"

    4) "id_8"

    5) "id_9"

    6) "id_20"

    7) "id_12"

    // HSCAN key cursor [MATCH pattern] [COUNT count]

    127.0.0.1:6379> hmset user.id.1 name 'Troy Zhang' age 30 email 'java-koma@163.com' addr 'ChengDu, SiChuan, China' gender 'male' job 'Mobile Developer' phone '110' dept 'WEBOP CD'

    OK

    127.0.0.1:6379> hscan user.id.1 0

    1) "0"

    2) 1) "name"

    2) "Troy Zhang"

    3) "age"

    4) "30"

    5) "email"

    6) "java-koma@163.com"

    7) "addr"

    8) "ChengDu, SiChuan, China"

    9) "gender"

    10) "male"

    11) "job"

    12) "Mobile Developer"

    13) "phone"

    14) "110"

    15) "dept"

    16) "WEBOP CD"

    Scan特点:

    1, Scan在redis server端是无状态的,任何时候你可以在中途中止迭代,而不需要通知redis server

    2, 多个client可以同时迭代同一个cursor

    Scan缺点:

    1, count不能保证每次返回指定数量的结果集

    2, 返回的key结果集有可能重复

    总结

    在prod环境下, redis建议使用scan,而不要使用 keys 和 smembers

    Since these commands allow for incremental iteration, returning only a small number of elements per call, they can be used in production without the downside of commands like KEYS or SMEMBERS that may block the server for a long time (even several seconds) when called against big collections of keys or elements.

    展开全文
  • 我们的产品均基于Redis开发,但是Redis的基础数据类型并不支持多条件查询,模糊搜索等,因此我们修改了Redis源码,通过辅助索引的方式,将Redis改造成可以像SQL数据那样使用的数据库。OnceDB并不改变Redis的数据存储...

    我们的产品均基于Redis开发,但是Redis的基础数据类型并不支持多条件查询,模糊搜索等,因此我们修改了Redis源码,通过辅助索引的方式,将Redis改造成可以像SQL数据那样使用的数据库。

    OnceDB并不改变Redis的数据存储结构,Redis数据库文件可以直接在OnceDB中操作,然后再返回Redis中使用。

    全文搜索

    OnceDB提供直接搜索指令,支持 String 和 Hash 等对象,

    搜索String: search pattern operator value

    搜索 String 类型的键,可使用 search

    # 创建数据

    set test1 'this is testing'

    > OK

    set test2 'this is article'

    > OK

    # 搜索数据

    search test* ~ article

    1) test1

    2) this is testing

    3) test2

    4) this is article

    operator操作符支持: = 完全匹配 ~ 部分匹配 > >= < <= 比较匹配

    搜索Hash: hsearch pattern field operator value ...

    hsearch 可以实现对 Hash 对象的搜索。

    在redis中没有表的概念,一般使用 schema:id 的键名包含表名和主键。比如 user:001 为 user 表,主键值为001的 Hash 对象。

    # 创建 Hash 数据

    hmset user:001 name kris email c2u@live.cn gender male age 16

    > OK

    hmset user:002 name sunny age 24

    > OK

    # 搜索 Hash 数据

    hsearch user:* age > 18 name = *

    1) user:002

    2) 24

    3) sunny

    搜索ZSET: zhsearch key from to schema field operator value ...

    直接使用 test* 或 use:* 模式匹配,因为会遍历所有的键,性能低下。zhsearch可以在有序列表中搜索对应主键,并指定搜索范围。

    在上例中,我们将 user 的主键值存放到 *user 有序列表中, 分数为一个关于时间的整数

    zadd *user 20020201 001 20020202 002

    搜索第一条匹配的数据(从0到0)

    zhsearch *user 0 0 user: age > 10

    1) -1

    2) user:001

    3) 16

    使用全文搜索时,第一个返回的参数始终是 -1。

    索引搜索

    搜索原理

    全文搜索的性能比较差,可通过创建索引的办法提高性能,办法是为索引字段创建一个有序列表,然后在条件查询时,对这些有序列表做交集查询操作。

    # 创建4条 Hash 数据

    hmset article:001 poster dota visit 21 key js

    hmset article:002 poster dota visit 11 key c

    hmset article:003 poster like visit 34 key js

    hmset article:004 poster like visit 44 key c

    然后我们为上面的字段创建索引,权重分数设为: 202000201,一个关于时间的整数,值为article的ID值

    # 维护索引

    zadd *article.poster:dota 20200201 001 20200201 002

    zadd *article.poster:like 20200201 003 20200201 004

    zadd *article.key:js 20200201 001 20200201 003

    zadd *article.key:c 20200201 002 20200201 004

    # visit 的索引直接使用其值为权重分数

    zadd *article.visit 21 001 11 002 34 003 44 004

    按索引查询

    求 *article.key:js 和 *article.poster:dota 两个索引的交集,并存放在 *tmp1 有序列表中:

    zinterstore *tmp1 2 *article.key:js *article.poster:dota

    > 1

    然后 *tmp1 存放的就是 满足 key = js 和 poster = dota 条件的 ID集合:

    zrange *tmp1 0 -1

    > 001

    可使用 zrangehmget 指令打印相应的HASH值:

    zrangehmget *tmp1 0 -1 article: key poster

    1) 001

    2) 40400402

    3) js

    4) dota

    5)

    6)

    其结果与直接全文搜索 key = js 和 poster = dota 的搜索结果相同

    hsearch article:* key = js poster = dota

    1) article:001

    2) js

    3) dota

    搜索范围

    比如要搜索 visit 数量在 20 到 30 之间,key = js 的数据,可通过控制权重的方法实现

    创建临时索引,只取 *article.visit 的权重 和 key = js 的数据

    zinterstore *tmp2 2 *article.key:js *article.visit weights 0 1

    > 2

    取 20 ~ 30 之间的数据

    zrangebyscore *tmp2 20 30

    > 001

    可使用 zrangehmgetbyscore 打印出对应的hash数据:

    zrangehmgetbyscore *tmp2 20 30 article: key visit

    1) 001

    2) 21

    3) js

    4) 21

    5)

    6)

    其结果与使用全文搜索的结果一致:

    hsearch article:* visit >= 20 visit <= 30 key = js

    1) article:001

    2) 21

    3)

    4) js

    因为里面有两个相同的字段,visit >= 20 visit <= 30,搜索结果只会输出一个,第3行重复的字段会输出空。

    自动索引

    Redis索引的创建和维护并不十分方便,OnceDB 在数据修改时可选择自动创建辅助索引。

    创建索引:upsert schema field operator value ...

    使用 upsert/insert/update 指令和特殊的操作符可自动创建索引:

    如上文的例子可写成:

    upsert article id @ 001 poster ? dota visit / 21 key ? js

    upsert article id @ 002 poster ? dota visit / 11 key ? c

    upsert article id @ 003 poster ? like visit / 34 key ? js

    upsert article id @ 004 poster ? like visit / 44 key ? c

    操作符:@ : 主键 ? : 分组索引 / : 排序索引

    操作后会自动创建: *article *article.poster:dota *article.poster:like *article.visit *article.key:js *article.key:c 等索引。

    多条件索引查询:find schema from to field operator value ...

    含有索引的字段,可使用 find 命令通过索引字段查询出来,比如查询:key = js 和 poster = dota 的数据,可通过 "?" 指明这两个字段是分组索引:

    find article 0 -1 key ? js poster ? dota

    1) 1

    2) article:001

    3) js

    4) dota

    1: 代表符合条件的数据总数,如果是 -1 则代表使用了全文搜索,性能较差。

    索引范围查询

    可添加 @ 指定索引范围,并使用 + 指定使用哪个索引字段的分数权重范围。

    find article 0@20 -1@30 key ? js visit /+ *

    1) 1

    2) article:001

    3) js

    4) 21

    删除自动索引

    OnceDB不存储索引定义,删除时需要手动指出哪些字段含有索引,需要指定字段名和索引操作符即可。

    remove article @ 001 key ? poster ? visit /

    还可以自定义索引名称,权重分数,更多说明可查看:

    展开全文
  • 1个匹配[mnl]匹配m,n,l其中之一一、模糊搜索查询redis 默认有16个DB ,分别是 0-15redis-cli: 进入默认是第一个DB 0select n: 切换 DB1. *:0个或多个匹配例1:查找所有的key127.0.0.1:6379> select 9OK127.0.0.1....

    前言

    本文转载自博客园:

    1. 预备知识:redis支持的3种模糊查询操作

    元字符

    说明

    *

    0个或多个匹配

    ?

    1个匹配

    [mnl]

    匹配m,n,l其中之一

    一、模糊搜索查询

    redis 默认有16个DB ,分别是 0-15

    redis-cli: 进入默认是第一个DB 0

    select n: 切换 DB

    1. *:0个或多个匹配

    例1:查找所有的key

    127.0.0.1:6379> select 9

    OK

    127.0.0.1:6379[9]> keys *

    1) "age"

    2) "name"

    3) "k"

    例2:0个或多个匹配

    keys h*llo # 匹配 hllo 和 heeello 等。

    127.0.0.1:6379[9]> keys *ame

    1) "ame"

    2) "name"

    2. ?:1个匹配

    例:?一个匹配

    keys h?llo # 匹配 hello , hallo 和 hxllo 等,不能匹配hllo。

    127.0.0.1:6379[9]> keys ?ame

    1) "name"

    127.0.0.1:6379[9]> keys n?me

    1) "name"

    3. [lmn]: m,n,l其中之一

    keys h[ae]llo  # 匹配 hallo 和 hello ,但不匹配 hillo;特殊符号用 \ 隔开。

    127.0.0.1:6379[9]> keys *ame

    1) "ame"

    2) "mame"

    3) "lame"

    4) "name"

    127.0.0.1:6379[9]> keys [lmnk]ame

    1) "mame"

    2) "lame"

    3) "name"

    二、删除指定key

    1. 删除模糊匹配出的key

    redis-cli -n 数据库名(0-15) keys Pattern | xargs redis-cli -n 数据库名(0-15) del

    192:~ yuanjun$ redis-cli -n 9 keys "*ame"

    1) "ame"

    2) "mame"

    3) "lame"

    4) "name"

    192:~ yuanjun$ redis-cli -n 9 keys "*ame" | xargs redis-cli -n 9 del

    (integer) 4

    192:~ yuanjun$ redis-cli -n 9 keys "*ame"

    (empty list or set)

    2. flushdb:删除当前数据库中的所有Key

    flushdb

    3. del key: 删除单个 key

    127.0.0.1:6379> set name 'alex'

    OK

    127.0.0.1:6379> del name

    (integer) 1

    127.0.0.1:6379> get name

    (nil)

    4. exists:判断是否存在某个key

    在删除某个key之前可以先查询一下是否存在这个key

    127.0.0.1:6379> exists name

    (integer) 0

    127.0.0.1:6379> set name ss

    OK

    127.0.0.1:6379> exists name

    (integer) 1

    5. del key1 key2 ...: 同时删除多个key

    127.0.0.1:6379> set name sss

    OK

    127.0.0.1:6379> set lame sss

    OK

    127.0.0.1:6379> set kame sss

    OK

    127.0.0.1:6379> keys *

    1) "kame"

    2) "lame"

    3) "name"

    127.0.0.1:6379> del kame lame name

    (integer) 3

    三、批量删除匹配通配符的key

    需要使用Linux中的管道和xargs参数:

    redis-cli -n 数据库名(0-15) keys Pattern | xargs redis-cli -n 数据库名(0-15) del

    如果需要指定数据库,需要用到 -n 数据库编号 参数,下面是删除 2数据库中 s开头的键:

    如:

    redis-cli -n 2 keys "s*" | xargs redis-cli -n 2 del

    redis-cli keys "*" | xargs redis-cli del

    如果redis-cli没有设置成系统变量,需要指定redis-cli的完整路径

    如:

    /opt/redis/redis-cli keys "*" | xargs /opt/redis/redis-cli del

    展开全文
  • Redis命令行 我向Redis中存入若干个键值对...其实,Redis本身提供 对于键的模糊查询。 127.0.0.1:6379> set loli1 Mana OK 127.0.0.1:6379> set loli2 Alice OK 127.0.0.1:6379> set loli3 Cocoa OK 127.0.0.1
  • 通过用心设计各种数据结构类型的数据存储,可以实现部分的数据查询功能。因为在Redis的设计中,key是一切,对于Redis是可见的,而value对于Redis来说就是一个字节数组,Redis并不知道你的value中存储的是什么,所以...
  • 1.DEL 直接加键名称DEL key1 key2 key3127.0.0.1:6379> DEL site_msg_99973 false ... 批量删除key可用keys ‘str*’ 列出要删除的key,接linux管道删除(linux命令行执行)根据通配符查看待删除的keyredis-cli K...
  • 什么是慢查询和mysql的慢SQL日志分析一样,redis也有类似的功能,来帮助定位一些慢查询操作。Redis slowlog是Redis用来记录查询执行时间的日志系统。查询执行时间指的是不包括像客户端响应(talking)、发送回复等IO...
  • OnceDB 是基于 Redis 二次开发的全文搜索...条件查询在 OnceDB 的 node.js 驱动中,可直接使用类似 mongodb 的查询语法,来查询 redis 数据库:oncedb.select(schemaName, query, options, callback)示例,准备测试...
  • Redis 常见的性能问题和解决方法1、Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。2、Master AOF持久化...
  • like:t1001 来维护 t1001 这条微博的所有点赞用户 点赞了这条微博:sadd like:t1001 u3001取消点赞:srem like:t1001 u3001是否点赞:sismember like:t1001 u3001点赞的所有用户:smembers like:t1001点赞数:scard ...
  • 1.依赖和配置: <dependency> <groupId>org.springframework.boot<...spring-boot-starter-data-redis</artifactId> </dependency> RedisConfig: package com.english.english_vision
  • Redis 哈希(Hash)

    2021-09-23 09:37:47
    Redis Hash 是一个 String 类型的 field(域)和 value(值)的映射表,Hash 特别适合存储对象。Redis 中每个 Hash 可以存储 2^32-1 个键值对。 我们已经知道,Redis 中存储的都是 key-value 结构的数据,那么 Hash...
  • redis 模糊删除实现

    2021-05-20 02:26:05
    redis 没有直接提供模糊删除的实现,我们可以根据现有的指令进行组合实现:import java.util.Arrays;import java.util.Set;import javax.annotation.Resource;import org.springframework.data.redis.core....
  • Redis

    2021-03-23 20:02:27
    Redis 是什么? Redis(Remote Dictionary Server ),即远程字典服务 ! 是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库, 并提供多种语言的API。 redis会周期性的把...
  • redis key模糊查找

    2021-02-11 08:10:28
    *:通配任意多个字符?:通配单个字符[]:通配括号内的某一个字符returnstringRedisTemplate.keys("*"+ pattern +"*");return stringRedisTemplate.keys("?" + pattern);return stringRedisTemplate.keys("[" + ...
  • redis用途

    2021-03-06 18:48:40
    不从抽奖活动中移除 srandmember key count 实现点赞,签到,like等功能(set) # 1001用户给8001帖子点赞 sadd like::8001 1001 # 取消点赞 srem like::8001 1001 # 检查用户是否点过赞 sismember like::8001 1001 # ...
  • like:t1001 来维护 t1001 这条微博的所有点赞用户 点赞了这条微博:sadd like:t1001 u3001 取消点赞:srem like:t1001 u3001 是否点赞:sismember like:t1001 u3001 点赞的所有用户:smembers like:t1001 点赞数:...
  • redis

    2021-01-29 08:27:18
    # # If all this fails, Redis will start to reply with errors to commands # that will use more memory, like SET, LPUSH, and so on, and will continue # to reply to most read-only commands like GET....
  • Redis 的集合相当于 Java 语言里面的 HashSet,它内部的键值对是无序的唯一的。它的内部实现相当于一个特殊的字典,字典中所有的 value 都是一个值NULL。 当集合中最后一个元素移除之后,数据结构自动删除,内存被...
  • 下载redis镜像 我们可以直接执行以下命令 docker pull redis:6.0.6 执行完之后,我们使用docker images查看是否下载好了 ​ 这样就代表我们的redis镜像已经下载,接下来需要docker替我们创建并启动一个redis容器 ...
  • 随机返回key空间的一个 keyrename(oldname, newname):重命名key dbsize:返回当前数据库中key的数目 expire:设定一个key的活动时间(s) ttl:获得一个key的活动时间 select(index):按索引查询 move(key, dbindex...
  • import java.util....import redis.clients.jedis.Jedis;public class SetBitTest3 {/*public int uniqueCount(Jedis redis,String action, String date) {String key = action + ":" + date;BitSet users = Bit...
  • Redis连接池

    2021-03-25 19:52:51
    Redis 下载/安装/启动 第一步:下载c语言的编译环境 yum install gcc-c++ 创建一个redis目录 在/usr/local下面 mkdir /usr/local/redisredis的目录下 下载redis的安装包 如果不能...
  • Questions在数据库内我们可以通过like关键字、%、*或者REGEX关键字进行模糊匹配。而在Redis内我们如何进行模糊匹配呢?集群情况Redis Cluster的情况是否和单机一致呢?前段时间我对于这个议题进行了调查和研究。单...
  • 前言:在实际应用中这种...我大概的做法是这样的,编码使用多线程访问我的数据库,在访问数据库前先访问redis缓存没有的话在去查询数据库,需要注意的是redis最大连接数最好设置为300,不然会出现很多报错。package ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,605
精华内容 14,642
关键字:

like查询redis

redis 订阅