Redis的基本数据类型及运用场景 た 入场券 2022-11-27 07:10 194阅读 0赞 ## Redis的基本数据类型及运用场景 ## ### 文章目录 ### * * Redis的基本数据类型及运用场景 * * * 简介 * String * List * Hash * Set * Zset * 其他参考 #### 简介 #### Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。 #### String #### String是Redis最基本的数据类型,上面的简介中也说到Redis是用c语言开发的。但是Redis中的字符串和c语言中的字符串类型却是有明显的区别; string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M **基本命令** <table> <thead> <tr> <th>命令</th> <th>说明</th> <th>案例</th> </tr> </thead> <tbody> <tr> <td>set</td> <td>添加key-value</td> <td>set username admin</td> </tr> <tr> <td>get</td> <td>根据key获取数据</td> <td>get username</td> </tr> <tr> <td>strlen</td> <td>获取key的长度</td> <td>strlen key</td> </tr> <tr> <td>exists</td> <td>判断key是否存在</td> <td>exists name 返回1存在 0不存在</td> </tr> <tr> <td>del</td> <td>删除redis中的key</td> <td>del key</td> </tr> <tr> <td>keys</td> <td>用于查询符合条件的key</td> <td>keys * 查询redis中全部的key;keys n?me 使用占位符获取数据;keys nam* 获取nam开头的数据</td> </tr> <tr> <td>mset</td> <td>赋值多个key-value</td> <td>mset key1 value1 key2 value2 key3 value3</td> </tr> <tr> <td>mget</td> <td>获取多个key的值</td> <td>mget key1 key2</td> </tr> <tr> <td>append</td> <td>对某个key的值进行追加</td> <td>append key value</td> </tr> <tr> <td>type</td> <td>检查某个key的类型</td> <td>type key</td> </tr> <tr> <td>select</td> <td>切换redis数据库</td> <td>select 0-15 redis中共有16个数据库</td> </tr> <tr> <td>flushdb</td> <td>清空单个数据库</td> <td>flushdb</td> </tr> <tr> <td>flushall</td> <td>清空全部数据库</td> <td>flushall</td> </tr> <tr> <td>incr</td> <td>自动加1</td> <td>incr key</td> </tr> <tr> <td>decr</td> <td>自动减1</td> <td>decr key</td> </tr> <tr> <td>incrby</td> <td>指定数值添加</td> <td>incrby 10</td> </tr> <tr> <td>decrby</td> <td>指定数值减 decrby 10</td> <td></td> </tr> <tr> <td>expire</td> <td>指定key的生效时间 单位秒</td> <td>expire key 20 key20秒后失效</td> </tr> <tr> <td>pexpire</td> <td>指定key的失效时间 单位毫秒</td> <td>pexpire key 2000;key 2000毫秒后失效</td> </tr> <tr> <td>ttl</td> <td>检查key的剩余存活时间</td> <td>ttl key</td> </tr> <tr> <td>persist</td> <td>撤销key的失效时间</td> <td>persist key</td> </tr> </tbody> </table> **setex(set with expire)键秒值** setex:设置带过期时间的key,动态设置。 setex 键 秒值 真实值 **setnx(set if not exist)** setex(set with expire)键秒值/setnx(set if not exist) \*\*应用场景:\*\*保证图片(Base64);统计粉丝数;包含用户信息 #### List #### Redis中的List集合是双端循环列表,分别可以从左右两个方向插入数据. **底层实际是个链表** List集合可以当做队列使用,也可以当做栈使用 队列:存入数据的方向和获取数据的方向相反 栈:存入数据的方向和获取数据的方向相同 **基本命令** <table> <thead> <tr> <th>命令</th> <th>说明</th> <th>案例</th> </tr> </thead> <tbody> <tr> <td>lpush</td> <td>从队列的左边入队一个或多个元素</td> <td>LPUSH key value [value …]</td> </tr> <tr> <td>rpush</td> <td>从队列的右边入队一个或多个元素</td> <td>RPUSH key value [value …]</td> </tr> <tr> <td>lpop</td> <td>从队列的左端出队一个元素</td> <td>LPOP key</td> </tr> <tr> <td>rpop</td> <td>从队列的右端出队一个元素</td> <td>RPOP key</td> </tr> <tr> <td>lpushx</td> <td>当队列存在时从队列的左侧入队一个元素</td> <td>LPUSHX key value</td> </tr> <tr> <td>rpushx</td> <td>当队列存在时从队列的右侧入队一个元素</td> <td>RPUSHx key value</td> </tr> <tr> <td>lrange</td> <td>从列表中获取指定返回的元素</td> <td>LRANGE key start stop</td> </tr> <tr> <td>Lrange key 0 -1</td> <td>获取全部队列的数据</td> <td></td> </tr> <tr> <td>lrem</td> <td>从存于 key 的列表里移除前 count 次出现的值为 value 的元素</td> <td></td> </tr> <tr> <td>Lset</td> <td>设置 index 位置的list元素的值为 value</td> <td>LSET key index value</td> </tr> </tbody> </table> **性能总结** 它是一个字符串链表,left、right都可以插入添加; 如果键不存在,创建新的链表; 如果键已存在,新增内容; 如果值全移除,对应的键也就消失了。 链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就很惨淡了。 **应用场景**:阻塞队列 #### Hash #### Redis hash 是一个键值对集合。 Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。 类似Java里面的Map<String,Object> Hash对象的实现方式有两种分别是ziplist、hashtable,其中hashtable的存储方式key是String类型的,value也是以key value的形式进行存储。 字典类型的底层就是hashtable实现的,明白了字典的底层实现原理也就是明白了hashtable的实现原理,hashtable的实现原理可以于HashMap的是底层原理相类比 例子:User对象\{id:2,name:小明,age:19\} **基本命令:** <table> <thead> <tr> <th>命令</th> <th>说明</th> <th>案例</th> </tr> </thead> <tbody> <tr> <td>hset</td> <td>为对象添加数据</td> <td>hset key field value</td> </tr> <tr> <td>hget</td> <td>获取对象的属性值</td> <td>hget key field</td> </tr> <tr> <td>hexists</td> <td>判断对象的属性是否存在</td> <td>HEXISTS key field;1表示存在 0表示不存在</td> </tr> <tr> <td>hdel</td> <td>删除hash中的属性</td> <td>hdel user field [field …]</td> </tr> <tr> <td>hgetall</td> <td>获取hash全部元素和值</td> <td>HGETALL key</td> </tr> <tr> <td>hkyes</td> <td>获取hash中的所有字段</td> <td>HKEYS key</td> </tr> <tr> <td>hlen</td> <td>获取hash中所有属性的数量</td> <td>hlen key</td> </tr> <tr> <td>hmget</td> <td>获取hash里面指定字段的值</td> <td>hmget key field [field …]</td> </tr> <tr> <td>hmset</td> <td>为hash的多个字段设定值</td> <td>hmset key field value [field value …]</td> </tr> <tr> <td>hsetnx</td> <td>设置hash的一个字段,只有当这个字段不存在时有效</td> <td>HSETNX key field value</td> </tr> <tr> <td>hstrlen</td> <td>获取hash中指定key的长度</td> <td>HSTRLEN key field</td> </tr> <tr> <td>hvals</td> <td>获取hash的所有值</td> <td>HVALS user</td> </tr> </tbody> </table> #### Set #### Set(集合) Redis的Set是string类型的无序集合。它是通过HashTable实现实现的, **基本命令** <table> <thead> <tr> <th>命令</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td>sadd key value</td> <td>向set添加元素</td> </tr> <tr> <td>srem key value</td> <td>从set中移除元素</td> </tr> <tr> <td>smembers key</td> <td>取出所有set元素</td> </tr> <tr> <td>sismember key value</td> <td>查看value是否存在set中</td> </tr> <tr> <td>sunion key1 key2 … keyn</td> <td>将所有key合并后取出来,相同的值只取一次</td> </tr> <tr> <td>scard key</td> <td>获取set中元素的个数</td> </tr> <tr> <td>srandmember key</td> <td>return a random element from a set, without removing the element.随机取出一个</td> </tr> <tr> <td>sdiff key1 key2 … keyn</td> <td>获取第一set中不存在后面几个set里的元素。</td> </tr> <tr> <td>sdiffstore dstkey key1 key2 … keyn</td> <td>和sdiff相同,获取key1中不存在其他key里的元素,但要存储到dstkey中。</td> </tr> <tr> <td>sinter key1 key2 … keyn</td> <td>取出这些set的交集</td> </tr> <tr> <td>sinterstore dstkey key1 key2 … keyn</td> <td>取出这些key的交集并存储到dstkey</td> </tr> <tr> <td>smove srckey dstkey member</td> <td>将元素member从srckey中转移到dstkey中,这个操作是原子的。</td> </tr> </tbody> </table> **应用场景:去重、抽奖、共同好友、二度好友** #### Zset #### **基本命令** zset(sorted set:有序集合) Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个double类型的分数。 redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复 **实现原理** 与set无顺序存储不同,Zset按score顺序进行存储,这也是为什么基本操作都是O(log(N))复杂度。 Redis使用两种结构存储zset,在数据个数较少时使用ziplist,数量超出阈值时使用skiplist,阈值通过zset-max-ziplist-entries and zset-max-ziplist-value设置 [redis zset内部实现][redis zset] [Redis Zset 实现原理][Redis Zset] [跳表(skiplist)的理解][skiplist] <table> <thead> <tr> <th>命令</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td>zadd key score member</td> <td>向有序set中添加元素member,其中score为分数,默认升序;</td> </tr> <tr> <td>zrange key start end [withscores]</td> <td>获取按score从低到高索引范围内的元素,索引可以是负数,-1表示最后一个,-2表示倒数第二个,即从后往前。withscores可选,表示获取包括分数。</td> </tr> <tr> <td>zrevrange key start end [withscores]</td> <td>同上,但score从高到低排序。</td> </tr> <tr> <td>zcount key min man</td> <td>获取score在min和max范围内的元素的个数</td> </tr> <tr> <td>zcard key</td> <td>获取集合中元素的个数。</td> </tr> <tr> <td>zincrby key increment member</td> <td>根据元素,score原子增加increment.</td> </tr> <tr> <td>zremrangebyscore key min max</td> <td>清空集合内的score位于min和max之间的元素。</td> </tr> <tr> <td>zrank key member</td> <td>获取元素的索引(照score从低到高排列)。</td> </tr> <tr> <td>zrem key member</td> <td>移除集合中的该元素</td> </tr> <tr> <td>zscore key member</td> <td>获取该元素的score</td> </tr> </tbody> </table> **应用场景**:排行榜前前10名的选手 #### 其他参考 #### 最详细的redis五种数据结构详解 https://juejin.im/post/6844904192042074126 Redis 和 I/O 多路复用 https://draveness.me/redis-io-multiplexing/ 中文文档 http://www.redis.cn/ [redis zset]: https://zsr.github.io/2017/07/03/redis-zset%E5%86%85%E9%83%A8%E5%AE%9E%E7%8E%B0/ [Redis Zset]: https://www.daxiaju.club/2019/06/28/Redis-Zset-%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86/ [skiplist]: https://blog.csdn.net/weixin_41462047/article/details/81253106
还没有评论,来说两句吧...