面试官经常问的Redis几种数据类型的用法和应用场景整理好了

1、字符串1.1 介绍
string 字符串类型是Redis中最为常用和基础的存储类型 , 是一个由字节组成的序列 , 他在Redis中是二进制安全的 , 也可以认为string字符串数据类型能够接收任何格式的数据 , 像JPEG图像数、Json等 , 是标准的key-value , 一般来存字符串 , 整数和浮点数 。

  • 数据长度:string字符串类型最大能容纳的512MB的数据长度 。

面试官经常问的Redis几种数据类型的用法和应用场景整理好了文章插图
1.2 使用场景
【面试官经常问的Redis几种数据类型的用法和应用场景整理好了】最常见的使用场景就是对于网站访问量的统计 , 例如在线人数、点赞数量和访问人数等 。
总体来说Redis的string字符串类型主要有以下几种应用场景:
  • 计数器
string类型的incr和decr命令可以将key中存储的数字进行+1、-1 , 这两种操作具有原子性 , 所以是安全的 。 所以在记录评论数、网站访问次数、商品销量等场景中可以用到 。
  • 分布式锁
string类型中可以使用setnx 来判断“当key不存在时 , 设置数值并返回1 , 当key存在时 , 返回0” 。 整个操作过程是原子性的执行 , 所以可以用在分布式锁的场景中 , 返回1获得锁 , 返回0没有获得所 。
jedisCommands.set("key", "1", "NX", "EX", 60);//如果"key"不存在 , 则将其设值为1 , 同时设置60秒的自动过期时间
  • 存储对象
大家都知道JSON具有强大的兼容性、易用性和可读性 , 可以在对象和JSON字符串间相互转换 。 所以可以将用户信息、商品信息等存储在string类型中 。
1.3 更多特性
面试官经常问的Redis几种数据类型的用法和应用场景整理好了文章插图
// stringasync function stringFun() {const [key1, key2, key3, key4, key5] = ["key1", "key2", "key3", "key4", "key5"];const [v1, v2, v3, v4, v5] = ["v1", "v2", "v3", "v4", "v5"];// 1. set getawait redis.set(key1, v1);// 2. 过期时间await redis.setex(key2, 10, v2);// 3. 自增await redis.incr(key3);// 4. 加减await redis.incrby(key3, 100);// 5. 是否存在const judgeKey4 = await redis.exists(key4);// 6. value lengthconst keyLen = await redis.strlen(key1);const getValue = http://kandian.youth.cn/index/await redis.get(key1);const hgetVaule = await redis.mget(key1, key2, key3);console.log("getValue : ", getValue);console.log("hgetVaule : ", hgetVaule);console.log("judgeKey4 : ", judgeKey4);// 6. 删除await redis.del(key1, key2, key3, key4);process.exit(1);};41 77 93 11 42 94 18 30 97 10 51 39 61 81 50 88 45 82 3 37 31 35 15 25 27 90 32 52 69 21 89 33 100 58 13 12 14 24 86 17 19 56 54 68 60 53 87 76 5 29 83 1 55 85 36 9 38 62 75 79 57 49 74 72 2 99 63 65 91 44 84 67 73 23 34 92 7 8 71 43 6 66 78 20 64 26 22 16 80 70 96 4 48 28 98 95 40 59 46 472、Hash2.1 介绍
在Redis中Hash数据类型可以看成具有string key和value的map容器 , hash支持可以将多个key/value 存储到一个key 中 。
  • 数据长度:每个 hash 可以存储 232 - 1 键值对(40多亿) 。
2.2 使用场景
  • 购物车
以用户id为key , 商品id为field , 商品数量为value , 恰好构成了购物车的3个要素 , 如下图所示 。
面试官经常问的Redis几种数据类型的用法和应用场景整理好了文章插图
  • 存储对象
hash类型是key、field和value结构 , 与常用的对象id、属性和值相似 , 所以也可以用来存储对象 。
2.3 更多特性
面试官经常问的Redis几种数据类型的用法和应用场景整理好了文章插图
/** * Hash * 应用场景: * 1. 【存-取-改】用户信息【ID、name、age..】 , 无需set\get string 序列化 。* 2. 初始化 , 缓存用户信息 * 3. 购物车 , 用户ID:物品ID、数量增减、删除 * 4. 商品的价格、销量、关注数、评价数等可能经常发生变化的属性 , 就适合存储在hash类型里 */async function hashFun() {const userObj = { id: 1, name: 'zhangsan', age: 18 }const userKey = 'user_1';// 1. hset key filed valueawait redis.hset(userKey, userObj);// 2. 所有的keyconst hkeys = await redis.hkeys(userKey);// 3. 整个valueconst hgetall = await redis.hgetall(userKey);console.log('hkeys: ', hkeys)console.log('hgetall: ', hgetall)// 4. 更改单个数值await redis.hset(userKey, 'age', 100);// 5. 字段加减await redis.hincrby(userKey, 'age', -90);const hgetall1 = await redis.hgetall(userKey);console.log('hgetall--: ', hgetall1)// 6. hsetnx 如果存在key , 则不更新await redis.hsetnx(userKey, 'name', 'lisi');// !7. expire 设置过期时间await redis.expire(userKey, 2);process.exit(1);/**% ts-node base.tshkeys:[ 'id', 'name', 'age' ]hgetall:{ id: '1', name: 'zhangsan', age: '18' }hgetall--:{ id: '1', name: 'zhangsan', age: '10' }*/}38 78 65 42 56 33 40 44 95 72 10 71 94 31 61 6 18 4 28 5 86 43 47 21 83 41 23 46 16 99 20 89 26 77 3 75 92 29 14 73 74 87 76 80 84 96 90 48 97 64 59 39 54 98 36 12 66 27 62 32 68 57 7 58 19 70 52 49 17 88 11 63 8 25 22 55 34 9 81 67 69 13 82 91 2 30 100 24 51 15 1 60 79 35 53 85 0 50 93 45