Duncan's Blog

Redis学习

Redis

1、为什么使用Redis数据库

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

2.数据类型

  • string

  • hash:键值对的集合

    hashset1 key1 val1 key2 val2```
    1
    2
    ```HGET hashset1 key1
  • list

    list1 val1```
    1
    2
    3
    4
    * set
    ```sadd set1 val1
    set1```
    1
    2
    3
    4
    * zset(有序集合,带分数)
    ```zadd key score memeber

3.set和hset区别

  • set 就是普通的已key-value 方式存储数据,可以设置过期时间。时间复杂度为 O(1)
  • hset 则是以hash 散列表的形式存储。超时时间只能设置在 大 key 上,单个 filed 则不可以设置超时

使用场景对比:set 存储单个大文本非结构化数据,hset 则存储结构化数据,一个 hash 存储一条数据,一个 filed 则存储 一条数据中的一个属性,value 则是属性对应的值。

4.Scan操作,keys()操作,线上谨慎使用

scan操作取N条出来进行scan,并保持prefix

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public HashSet<String> getKeysByScan(String pattern) {
ScanParams scanParams = new ScanParams().count(1000).match(pattern);
HashSet<String> allKeys = new HashSet<>();
cluster.getClusterNodes().values().forEach((pool) -> {
String cur = ScanParams.SCAN_POINTER_START;
do {
try (Jedis jedis = pool.getResource()) {
ScanResult<String> scanResult = jedis.scan(cur, scanParams);
allKeys.addAll(scanResult.getResult());
cur = scanResult.getStringCursor();
}
} while (!cur.equals(ScanParams.SCAN_POINTER_START));
});
return allKeys;
}
分享