- 业务需求
限制每个用户每天访问不同接口的次数,如:每个承运商每天只能根据运单号查询客户信息50次,每个承运商每天只能根据运单号查询商品信息30次。
- 方案选择
Redis是一个key-value存储系统,存放的value类型相对较多包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型),同时redis具有时效性,所以此处采用redis的方式实现业务需求。
- 选用redis哪种数据结构方式
value为string类型:key用于标识不同接口不同承运商,value代表对应承运商每天访问的客户信息的次数,虽然可以实现业务需求,但接口标志一直重复存储,浪费了内存。
A接口(承运商1)—>N A接口(承运商2)—>N …
B接口(承运商1)—>N B接口(承运商2)—>N …
value为集合类型:用这种方式还不如用value为string类型的方式。
value为hash类型:key用于存放接口标识,value为一个Map集合用来存放不同承运商访问对应接口的次数。这种方式如果要修改对应的访问次数只需要通过(接口标志+承运商标志)就可以直接修改,同时接口标志不会重复存储,避免了内存的浪费。
A接口—>{承运商1—>N,承运商2—>N …}B接口—>{承运商1—>N,承运商2—>N …}
- 业务流程图(点击下载流程图)
通过springboot的RedisTemplate操作redis hash数据结构的方法:
https://blog.youkuaiyun.com/weixin_37490221/article/details/78135036
redis.clients.jedis.exceptions.JedisDataException: ERR hash value is not an integer异常解决方案:
https://blog.youkuaiyun.com/qq_31071543/article/details/85158305