手机网站建设报价表好发信息网网站建设
手机网站建设报价表,好发信息网网站建设,简单项目计划书,桦甸市建设局网站注#xff1a;该文用于个人学习记录和知识交流#xff0c;如有不足#xff0c;欢迎指点。一、redis是kv数据库key#xff1a;string
value#xff1a;5 大基础核心结构String#xff08;字符串#xff09;Hash#xff08;哈希#xff09;List#xff08;列表#xf…注该文用于个人学习记录和知识交流如有不足欢迎指点。一、redis是kv数据库keystringvalue5 大基础核心结构String字符串Hash哈希List列表Set集合Sorted Set/ZSet有序集合。【 另外还有位图Bitmap、地理空间Geo等常用扩展结构基于基础结构实现】二、string1. 结构说明Redis 最基础、最常用的数据结构值可以是字符串、数字整数 / 浮点数、二进制数据如图片、序列化对象单个 String 最大支持 512MB。特点字符数组该字符串是动态字符串 raw字符串长度小于1M 时加倍扩容超过 1M 每次只多扩1M字符串最大长度为 512M注意redis 字符串是二进制安全字符串通过len来判断结尾而非 \0 可以存储图片二进制协议等二进制数据存储结构字符串长度小于等于 20 且能转成整数则使用 int 存储字符串长度小于等于 44则使用 embstr 存储字符串长度大于 44则使用 raw 存储2. 核心操作指令指令语法格式指令说明SETSET key value [EX seconds] [PX milliseconds] [NX | XX]EX、PX、NX、XX 顺序可以打乱设置键值对可选参数- EX设置过期时间秒- PX设置过期时间毫秒- NX仅当键不存在时才设置用于分布式锁- XX仅当键存在时才更新GETGET key获取指定键的值键不存在返回nilINCRINCR key对键的整数值进行原子自增 1键不存在则先初始化为 0 再自增DECRDECR key对键的整数值进行原子自减 1键不存在则先初始化为 0 再自减INCRBYINCRBY key increment原子自增指定数值increment 可为正 / 负等效于批量 INCR/DECRDECRBYDECRBY key decrement原子自减指定数值SETEXSETEX key seconds value简化版设置键值对并指定过期时间秒等效于SET EXSETNXSETNX key value简化版仅当键不存在时设置值等效于SET NXMSETMSET key1 value1 key2 value2 ...批量设置多个键值对原子操作MGETMGET key1 key2 ...批量获取多个键的值提升查询效率减少网络请求3. 典型应用场景单值数据缓存缓存商品详情、用户基本信息、首页热点数据。如果数据不常改动可以设置多个属性json格式SET role:10002 {[name]:dcf,[sex]:male,[age]:3}计数器系统累加器文章阅读量、视频播放量、接口调用次数。INCR article:read:1001 # 每次访问自增 1临时有效数据手机验证码、登录临时 token。SETEX sms:138xxxx1234 300 123456 # 5 分钟后自动过期分布式锁# 分布式锁 set lock uuid nx ex 30 # 保证锁的原子性设置和自动释放避免死锁 # 释放锁 del lock if (get(lock) uuid) del(lock)三、list1. 结构说明有序、可重复的元素集合基于双向链表实现两端操作头部 / 尾部性能极高中间插入 / 删除性能较差适合存储有序的序列数据。特点双向链表实现列表首尾操作删除和增加时间复杂度O(1) 查找中间元素时间复杂度为O(n) 存储结构列表中数据是否压缩的依据元素长度小于 48不压缩元素压缩前后长度差不超过 8不压缩2. 核心操作指令指令语法格式指令说明LPUSHLPUSH key value1 [value2 ...]从列表 ** 头部左侧** 插入一个 / 多个元素RPUSHRPUSH key value1 [value2 ...]从列表 ** 尾部右侧** 插入一个 / 多个元素LPOPLPOP key从列表头部弹出并删除一个元素列表为空返回nilRPOPRPOP key从列表尾部弹出并删除一个元素列表为空返回nilLRANGELRANGE key start stop获取列表中「start 到 stop」区间的元素索引从 0 开始stop-1表示获取所有元素LLENLLEN key获取列表的元素总个数BRPOPBRPOP key [key2 ...] timeout阻塞式从列表尾部弹出元素列表为空时阻塞等待 timeout 秒timeout0 表示永久阻塞适合消息队列LREMLREM key count value删除列表中 count 个值为 value 的元素count0 从头部删count0 从尾部删count0 删除所有LTRIMLTRIM key start stop裁剪列表仅保留「start 到 stop」区间的元素删除其他元素用于限制列表长度3. 典型应用场景栈先进后出 FILOLPUSH LPOP # 或者 RPUSH RPOP队列 先进先出FIFOLPUSH RPOP # 或者 RPUSH LPOP阻塞队列 blocking queueLPUSH BRPOP # 或者 RPUSH BLPOP异步消息队列操作与队列一样但是在不同系统间生成者和消费者最新消息 / 动态列表朋友圈动态、文章评论列表、系统通知列表。RPUSH moments:1001 动态1 动态2 ltrim moments:1001 0 99 # 限制列表长度避免内存溢出 LRANGE moments:1001 0 9 # 获取最新 10 条动态分页查询旧数据对于无需复杂筛选的历史数据如用户历史订单列表可通过LRANGE实现简单分页不适合高频更新、大数据量的分页场景。四、hash1. 结构说明用于存储键值对集合类似 Java 中的Map、Python 中的dict适合存储单个对象的多个属性可单独操作对象的某个字段无需修改整个对象。特点散列表在很多高级语言当中包含这种数据结构c unordered_map 通过 key 快速索引value存储结构节点数量大于 512hash-max-ziplist-entries 或所有字符串长度大于 64hash-max-ziplist-value则使用 dict 实现节点数量小于等于 512 且有一个字符串长度小于 64则使用 ziplist 实现2. 核心操作指令指令语法格式指令说明HSETHSET key field value [field2 value2 ...]给指定哈希表设置一个 / 多个字段 - 值对字段不存在则新增存在则更新HGETHGET key field获取哈希表中指定字段的值HMSETHMSET key field value [field2 value2 ...]批量设置哈希表字段Redis 3.0 后可直接用 HSET 替代HMGETHMGET key field [field2 ...]批量获取哈希表中多个字段的值HGETALLHGETALL key获取哈希表中所有字段和对应的值返回键值对列表HDELHDEL key field [field2 ...]删除哈希表中一个 / 多个字段HLENHLEN key获取哈希表中字段的总个数HKEYSHKEYS key获取哈希表中所有字段名HVALSHVALS key获取哈希表中所有字段对应的值HEXISTSHEXISTS key field判断哈希表中指定字段是否存在返回 1存在/ 0不存在3. 典型应用场景对象数据存储存储用户信息、商品属性、购物车功能、配置信息存储# 对象数据存储存储用户信息、商品属性 HSET user:1001 id 1001 name 张三 age 25 phone 138xxxx1234 HSET user:1001 age 26 # 可单独更新无需修改整个用户对象。 # 购物车功能以「用户 ID」为 Redis 键「商品 ID」为 Hash 字段「商品数量」为 Hash 值 HSET cart:1001 goods:1001 2 # 表示用户 1001 购物车中有 2 件商品 1001 HINCRBY cart:1001 goods:1001 1 # 实现商品数量加 1。 # 配置信息存储存储系统配置、应用参数 HSET config:app port 8080 timeout 30 log_level info # 方便单独查询和修改某个配置项。对比string存储json格式hash存储的对象使用于频繁更改属性的场景hmset user name dcf age 18 sex male # 与 string 比较 set string {[name]:mark,[sex]:male,[age]:18} # 修改 # hash hset user age 19 # string: get user # 将得到的字符串调用json解密取出字段修改 age 值 # 再调用json加密 set user {[name]:dcf,[sex]:male,[age]:19}五、set1. 结构说明无序、不可重复的元素集合基于哈希表实现支持高效的去重和集合运算交集、并集、差集单个元素最大支持 512MB。特点集合用来存储唯一性字段不要求有序存储不需要有序操作交并差集的时候排序存储结构元素都为整数且节点数量小于等于 512set-max-intset-entries则使用整数数组存储元素当中有一个不是整数或者节点数量大于 512则使用字典存储2. 核心操作指令指令语法格式指令说明SADDSADD key member1 [member2 ...]向集合中添加一个 / 多个元素重复元素自动去重SMEMBERSSMEMBERS key获取集合中所有元素无序返回SISMEMBERSISMEMBER key member判断元素是否在集合中返回 1存在/ 0不存在SREMSREM key member1 [member2 ...]从集合中删除一个 / 多个元素SCARDSCARD key获取集合中元素的总个数SINTERSINTER key1 [key2 ...]获取多个集合的交集所有集合中都存在的元素SUNIONSUNION key1 [key2 ...]获取多个集合的并集所有集合中的不重复元素SDIFFSDIFF key1 [key2 ...]获取多个集合的差集在 key1 中存在在其他集合中不存在的元素SRANDMEMBERSRANDMEMBER key [count]从集合中随机获取 count 个元素不删除元素count 缺省为 1SPOPSPOP key [count]从集合中随机弹出并删除 count 个元素3. 典型应用场景数据去重用户点赞列表、文章收藏列表、签到记录去重、黑白名单系统SADD article:like:1001 1001 1002 # 避免同一用户重复点赞 SISMEMBER article:like:1001 1002 # 判断用户是否已点赞 SADD blacklist:user 1003 # 接口请求时通过 SISMEMBER 判断用户是否在黑名单中。社交关系计算共同好友、推荐好友、共同兴趣标签。SINTER user:friends:1001 user:friends:1002 # 获取用户 1001 和 1002 的共同好友 SUNION user:friends:1001 user:friends:1002 # 获取用户的所有好友列表。 SDIFF user:friends:1001 user:friends:1002 # 用户 1002 可能想认识的人随机抽奖系统幸运大转盘、抽奖活动。SADD lottery:2026 1001 1002 ... SPOP lottery:2026 3 # 随机抽取 3 名中奖用户六、zset1. 结构说明有序、不可重复的元素集合每个元素关联一个浮点型分数scoreRedis 按 score 从小到大排序可反向排序支持按 score 范围和排名查询兼顾了 Set 的去重特性和 List 的有序特性。特点有序集合用来实现排行榜它是一个有序唯一存储结构节点数量大于 128 或者有一个字符串长度大于 64则使用跳表skiplist节点数量小于等于 128zset-max-ziplist-entries且所有字符串长度小于等于 64zset-max-ziplist-value则使用 ziplist 存储复杂度数据少的时候节省空间 O(n)数量多的时候访问性能O(1) or O(log_{2}{n})2. 核心操作指令指令语法格式指令说明ZADDZADD key score1 member1 [score2 member2 ...]向有序集合中添加一个 / 多个元素score 为排序依据重复 member 会更新其 scoreZRANGEZRANGE key start stop [WITHSCORES]按 score从小到大获取「start 到 stop」区间的元素WITHSCORES同时返回元素和对应的 scoreZREVRANGEZREVRANGE key start stop [WITHSCORES]按 score从大到小获取区间元素适合排行榜倒序查询ZRANGEBYSCOREZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]按 score 范围获取元素min/max 可使用(表示开区间如(100表示大于 100ZINCRBYZINCRBY key increment member给指定元素的 score 原子增减指定数值increment 可为正 / 负ZREMZREM key member1 [member2 ...]从有序集合中删除一个 / 多个元素ZCARDZCARD key获取有序集合中元素的总个数ZSCOREZSCORE key member获取指定元素对应的 score 值ZRANKZRANK key member获取指定元素的排名从小到大排名从 0 开始ZREVRANKZREVRANK key member获取指定元素的排名从大到小排名从 0 开始3. 典型应用场景各类排行榜系统销量榜、积分榜、热度榜、游戏天梯榜ZADD goods:sales 100 goods:1001 200 goods:1002 ZREVRANGE goods:sales 0 9 WITHSCORES # 获取销量前 10 商品 ZINCRBY goods:sales 1 goods:1001 # 实现销量加 1延时队列将任务的执行时间戳作为 score消费者定期通过ZRANGEBYSCORE获取当前时间之前的任务执行。ZADD delay:queue 1735660800 task:1001 # 表示任务 1001 在 2025-01-01 00:00 执行。分布式定时器:生产者将定时任务 hash 到不同的 redis 实体中为每一个 redis 实体分配一个 dispatcher 进程用来定时获取 redis 中超时事件并发布到不同的消费者中时间窗口限流:系统限定用户的某个行为在指定的时间范围内动态只能发生 N 次# 指定用户 user_id 的某个行为 action 在特定时间内 period 只允许发生该行为做大次数 max_count local function is_action_allowed(red, userid, action, period, max_count) local key tab_concat({hist, userid, action}, :) local now zv.time() red:init_pipeline() -- 记录行为 red:zadd(key, now, now) -- 移除时间窗口之前的行为记录剩下的都是时间窗口内的记录 red:zremrangebyscore(key, 0, now - period *100) -- 获取时间窗口内的行为数量 red:zcard(key) -- 设置过期时间避免冷用户持续占用内存 时间窗口的长度1秒 red:expire(key, period 1) local res red:commit_pipeline() return res[3] max_count end # 维护一次时间窗口将窗口外的记录全部清理掉只保留窗口内的记录 # 缺点记录了所有时间窗口内的数据如果这个量很大不适合做这样的限流漏斗限流 # 注意如果用 key expire 操作也能实现但是实现的是熔断限流这里是时间窗口限流的功能七、常用扩展数据结构1. 位图Bitmap1.1 结构说明并非独立数据结构基于 String 实现按「位」存储数据每个位只能是 0 或 1极大节省内存空间1 个字节 8 位可存储 8 个状态。1.2 核心操作指令指令语法格式指令说明SETBITSETBIT key offset value设置指定偏移量offset从 0 开始的位值0/1GETBITGETBIT key offset获取指定偏移量的位值BITCOUNTBITCOUNT key [start end]统计位图中 1 的个数start/end 为字节索引可选BITOPBITOP operation destkey key1 [key2 ...]位图运算AND/OR/XOR/NOT结果存入 destkey1.3 典型应用场景用户签到系统SETBIT user:sign:1001 0 1 # 表示用户 1001 第 1 天签到 BITCOUNT user:sign:1001 # 统计当月签到天数活跃度统计# 查询用户1001是否当月有活跃 BITOP OR user:active:202601 user:active:20260101 user:active:20260102 # 合并所有日期 GETBIT user:active:202601 1001 # 1有活跃0无活跃 # 2. 查询用户1001是否当月满勤 BITOP AND user:full:202601 user:active:20260101 user:active:20260102 # 合并所有日期 GETBIT user:full:202601 1001 # 1满勤0有缺勤批量状态判断如判断用户是否领取过某类优惠券1 表示已领取0 表示未领取。2. 地理空间Geo2.1 结构说明并非独立数据结构基于 ZSet 实现用于存储经纬度坐标支持距离计算、附近地点查询等地理空间操作。2.2 核心操作指令简略指令语法格式指令说明GEOADDGEOADD key longitude latitude member [lon2 lat2 member2 ...]添加地理位置经度、纬度、地点名称GEOPOSGEOPOS key member1 [member2 ...]获取指定地点的经纬度坐标GEODISTGEODIST key member1 member2 [unit]计算两个地点之间的距离unit 可选m 米、km 千米默认 mGEORADIUSGEORADIUS key longitude latitude radius unit [WITHDIST] [WITHCOORD]根据指定经纬度查询半径范围内的地点WITHDIST 返回距离WITHCOORD 返回坐标GEOSEARCHGEOSEARCH key FROMMEMBER member BYRADIUS radius unit [ASC | DESC]根据指定地点查询半径范围内的地点Redis 6.2 支持更易用详尽指令语法格式指令说明GEOADDGEOADD key longitude latitude member [lon2 lat2 member2 ...]添加地理位置经度、纬度、地点名称・限制经度范围-180~180纬度范围-85.05112878~85.05112878超出会报错・返回值成功添加的member数量GEOPOSGEOPOS key member1 [member2 ...]获取指定地点的经纬度坐标・返回值每个member对应[经度, 纬度]数组不存在的member返回nilGEODISTGEODIST key member1 member2 [unit]计算两个地点之间的距离•unit可选值m米默认、km千米、mi英里、ft英尺• 返回值距离字符串如1.5210任意member不存在则返回nilGEORADIUSGEORADIUS key longitude latitude radius unit [WITHDIST] [WITHCOORD] [WITHHASH] [COUNT count] [ASC|DESC]根据指定经纬度查询半径范围内的地点・附加参数-WITHDIST返回地点与中心的距离-WITHCOORD返回地点的经纬度-WITHHASH返回地点的 52 位 GeoHash 值-COUNT count限制返回结果的数量-ASC/DESC按距离「由近到远 / 由远到近」排序GEOSEARCHGEOSEARCH key [FROMMEMBER member|FROMLONLAT lon lat] [BYRADIUS radius unit | BYBOX width height unit] [WITHDIST] [WITHCOORD] [WITHHASH] [COUNT count] [ASC|DESC]灵活查询地理范围Redis 6.2 支持・范围中心-FROMMEMBER以已有地点为中心-FROMLONLAT以指定经纬度为中心・范围形状-BYRADIUS圆形半径范围-BYBOX矩形范围宽度、高度为边长・附加参数同GEORADIUSGEOSEARCHSTOREGEOSEARCHSTORE destkey sourcekey [FROMMEMBER member|FROMLONLAT lon lat] [BYRADIUS radius unit|BYBOX width height unit] [COUNT count] [ASC|DESC]将GEOSEARCH的查询结果存储到destkey类型为 ZSet・返回值成功存储的地点数量・用途批量查询后持久化结果便于后续二次处理补充说明GEORADIUS是旧版指令Redis 6.2GEOSEARCH是新版替代指令更推荐单位支持m米、km公里、mi英里、ft英尺WITHDIST会返回距离数值ASC表示按距离由近到远排序DESC是由远到近。2.3 典型应用场景附近的人 / 门店# 添加外卖商家到key store:location经度 纬度 商家ID GEOADD store:location 116.3956 39.9299 商家1 # 北京王府井附近 GEOADD store:location 116.4100 39.9100 商家2 # 北京东单附近 GEOADD store:location 116.4300 39.9000 商家3 # 北京国贸附近距离中心3公里 # 以 “用户位置116.40 39.90北京建国门附近” 为中心 # 查 3 公里内的商家显示距离 按距离由近到远排序 GEORADIUS store:location 116.40 39.90 3 km WITHDIST ASC地理位置排序如旅游平台按距离远近排序景点、酒店。# 添加旅游景点到key scenic:location GEOADD scenic:location 116.3972 39.9165 故宫 # 北京故宫 GEOADD scenic:location 116.4038 39.9240 天安门 # 北京天安门 GEOADD scenic:location 116.4810 39.9128 颐和园 # 北京颐和园距离中心较远 # 以 “用户位置116.40 39.90” 为中心查 5 公里内的景点按距离由近到远排序 # Redis 6.2推荐用GEOSEARCH更灵活按成员为中心查询 GEOSEARCH scenic:location FROMLONLAT 116.40 39.90 BYRADIUS 5 km WITHDIST ASC配送范围判断如判断用户是否在商家的配送范围内通过GEODIST计算距离是否小于配送阈值。# 添加外卖商家到key store:location经度 纬度 商家ID GEOADD store:location 116.3956 39.9299 商家1 # 北京王府井附近 GEOADD store:location 116.4100 39.9100 商家2 # 北京东单附近 GEOADD store:location 116.4300 39.9000 商家3 # 北京国贸附近距离中心3公里 # 假设 “商家 1 的配送范围是 2 公里”计算用户116.40 39.90到商家 1 的距离 # 判断是否≤2 公里 # 指令GEODIST key 成员1 成员2 单位 GEODIST store:location 商家1 116.40 39.90 km八、查找KeyRedis 中用于查找 / 列出 key 的核心命令主要是KEYS和SCAN其中SCAN是更推荐在生产环境使用的方式。下面我会详细介绍这些命令的用法、区别和最佳实践。1. KEYS 命令简单但不推荐生产使用KEYS是最基础的查找 key 的命令支持通配符匹配但会阻塞 Redis 主线程在数据量大时可能导致服务卡顿因此仅建议在开发 / 调试环境使用。语法KEYS pattern通配符规则*匹配任意数量的任意字符包括 0 个?匹配单个任意字符[]匹配括号内的单个字符如[abc]匹配 a、b 或 c\转义特殊字符示例# 列出所有 key KEYS * # 列出以 user: 开头的所有 key KEYS user:* # 列出以 order 结尾的所有 key KEYS *order # 列出第二个字符是 a 的 key如 ka1, ba2 KEYS ?a* # 列出以 prod 开头且第三个字符是 1 或 2 的 key如 prod1, prod2 KEYS prod[12]*2. SCAN 命令生产环境推荐SCAN是迭代式查找 key 的命令非阻塞分批返回结果适合在生产环境遍历大量 key避免阻塞 Redis。语法SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]参数说明cursor游标初始值为 0每次返回结果会包含下一个游标直到返回 0 表示遍历完成MATCH pattern可选通配符匹配规则同 KEYSCOUNT count可选指定每次迭代返回的 key 数量非精确值默认 10TYPE type可选按数据类型过滤如 string、hash、list、set、zset示例# 初始迭代游标 0匹配所有 key每次返回约 20 个 SCAN 0 MATCH * COUNT 20 # 迭代以 user: 开头的 key按类型过滤为 hash SCAN 0 MATCH user:* TYPE hash # 假设第一次返回游标 50继续迭代 SCAN 50 MATCH user:* TYPE hash返回结果示例1) 50 # 下一个游标 2) 1) user:1001 2) user:1002 3) user:10033. 辅助命令DBSIZE快速获取当前数据库的 key 总数无需遍历性能极高DBSIZEEXISTS检查指定 key 是否存在可批量检查EXISTS key1 key2 # 返回存在的 key 数量TYPE查看指定 key 的数据类型配合查找结果使用TYPE user:10014. 使用建议开发 / 调试环境可临时使用KEYS操作简单。生产环境必须使用SCAN避免阻塞主线程如果需要统计 key 总数优先用DBSIZE而非KEYS *。通配符优化尽量缩小匹配范围如user:*而非*减少迭代次数。集群环境KEYS/SCAN仅作用于当前连接的节点如需遍历整个集群需逐个节点执行。5. 总结Redis 查找 key 的核心命令是KEYS简单但阻塞和SCAN非阻塞生产推荐均支持通配符匹配。SCAN通过游标分批迭代搭配MATCH/TYPE/COUNT参数可精准过滤 key避免服务卡顿。辅助命令DBSIZE/EXISTS/TYPE可配合查找操作提升效率和准确性。九、细节补充1. key的设计单一功能一个key取有意义的就行相同功能多个key以 : 作为分割tips为什么使用冒号业内常用界面客户端的工具也常用:来表示子目录2. 怎么删除keydel key删除该键值对当value为空的时候会自动移除该key3. 怎么创建key添加的时候如果不存在key那么redis会自动创建4. 业务中常用组合数据结构hash 的 value 存放 list/set/zet 的 keyhash listhash sethash zet