Redis学习笔记二(常用五大数据类型)
2022/6/20 2:23:07
本文主要是介绍Redis学习笔记二(常用五大数据类型),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1. 键(key)
- 命令
keys * 查看key exists key 判断是否存在 type key key的类型 del key 删除key unlink key 根据value选择非阻塞删除(异步删除) expire key time[s] 设置key的过期时间 ttl key 查看还有多少秒过期,-1表示你永不过期,-2表示已过期(过期则直接丢弃) select <dbid> 切换数据库 dbsize 查看当前数据库有多少个key flushdb 清空当前库 flushall 清空所有库
- 测试
#添加键值 127.0.0.1:6379> set k1 lucy OK 127.0.0.1:6379> set k2 jack OK 127.0.0.1:6379> set k3 Tom OK #查看键值 127.0.0.1:6379> keys * 1) "k1" 2) "k3" 3) "k2" 127.0.0.1:6379> exists k1 (integer) 1 127.0.0.1:6379> exists k4 (integer) 0 127.0.0.1:6379> type k2 string 127.0.0.1:6379> del k3 (integer) 1 127.0.0.1:6379> keys * 1) "k1" 2) "k2" #设置时效性 127.0.0.1:6379> expire k1 3 (integer) 1 127.0.0.1:6379> ttl k1 (integer) -2 127.0.0.1:6379> keys * 1) "k2" 127.0.0.1:6379> dbsize (integer) 1 127.0.0.1:6379> select 2 OK 127.0.0.1:6379[2]> dbsize (integer) 0
2. String
- 二进制安全,可以存放任何数据,value 最大为512M
set <key> <value> get <key> append <key> <value> 在给定的<value>后面追加 strlen <key> setnx <key> <value> 只有不存在的时候才能设置成功 incr <key> 将存储的数字值加1,只能对数字值操作;为空,新增值为1 decr <key> 将存储的数字值减1 incrby/decrby <key> <step> 将存储的数字值加/减step mset <key1> <value1> <key1> <value2> .. 同时设置多个值(一个失败都失败,原子操作) mget <key1> <key2> .. 同时获取多个值(一个失败都失败,原子操作) msetnx <key1> <value1> <key2> <value2> .. 同时设置多个值(一个失败都失败,原子操作) getrange <key> <起始位置><结束位置> 获取值的一段长度 setrange <key> <起始位置><value> 从起始位置开始用value覆盖之后的值 setex <key> <seond> <value> 设置过期时间 getset <key> <value> 设置新值,并返回旧值
-
所有操作都是原子操作:不会被线程调度机制打断
java的自加加操作不是原子操作,i++:可以分为i+1,和i = i+1,多个线程的话,两步可能被打断,导致加一和赋值不是同一个值 -
数据结构为简单动态字符串,可以修改,类似java的ArrayList,采用预分配冗余空间的方式,减少频繁内存空间分配
- 字符串长度小于1M时,扩容都是加倍现有的空间;
- 大于1M时,每次扩容1M;
- 最大不能超过512M
127.0.0.1:6379[2]> mset k6 120 k9 129 k0 qw OK 127.0.0.1:6379[2]> keys * 1) "k9" 2) "k0" 3) "k6" 127.0.0.1:6379[2]> mget k6 k9 k0 1) "120" 2) "129" 3) "qw"
3. List
单键多值
- 可以在头部和尾部添加元素
- 常用命令
lpush/rpush <key> <value1> <value2> ... 从左边/右边插入一个或多个值(初始也是这样) lpop/rpop <key> 从左边/右边弹出一个值,值在键在,值光键亡 rpoplpush <key1> <key2> 从<key1>列表右边吐出一个值,插到<key2>列表左边(没有lpoprpush ) lrange <key> <start> <stop> 按照索引下标获得元素(从左到右)0表示左边第一个,-1表示右边第一个) lindex <key> <index> 按照索引下标获得元素 llen <key> 获取列表长度 linsert <key> before/after <value> <newvalue> 在遇到的第一个等于value前/后面插入newvalue lrem <key> <n> <value> 从左边删除n个value值(超过则删除全部相同值)
- 具体的底层数据结构
快速链表quickList- 列表元素较少,使用一块连续的内存空间,结构为zipList(压缩链表),将所有元素紧挨着一起存储
- 数据量比较大的时候,才会使用quickList(双向链表),将一个个ziplist连接起来
- 双向链表,对两端的操作性能较高,通过索引下标操作中间的节点性能较差
127.0.0.1:6379> lpush k2 12 343 56 (integer) 3 127.0.0.1:6379> lrange k2 0 -1 1) "56" 2) "343" 3) "12" 127.0.0.1:6379> keys * 1) "k1" 2) "k2" 127.0.0.1:6379> lpush k2 56 56 (integer) 5 127.0.0.1:6379> lrange k2 0 -1 1) "56" 2) "56" 3) "56" 4) "343" 5) "12" 127.0.0.1:6379> linsert k2 before 56 2 (integer) 6 127.0.0.1:6379> lrange k2 0 -1 1) "2" 2) "56" 3) "56" 4) "56" 5) "343" 6) "12" 127.0.0.1:6379> lrem k2 5 56 (integer) 3 127.0.0.1:6379> lrange k2 0 -1 1) "2" 2) "343" 3) "12"
4. set
- 特点
- 自动去重
- 提供了判断某元素是否存在的接口
- 无序集合,底层是value为null的hash表
- 添加,删除,查找,复杂度都是O(1)
- 常用命令
sadd <key> <value1> <value2> ... 添加一个或多个值(初始也是这样) smembers <key> 获取所有值 sismember <key1> <value1> <key1>中,是否存在value1 scard <key> <key1>中的元素个数 srem <key> <value1> <value2> ... 删除<key1>中指定的元素,没有的元素则跳过 spop <key> 随机吐出一个值,值光键亡 srandmember <key> <n> 随机获取n个值,不从集合中删除 #多集合之间的操作 smove <key1> <key2> <value> 将value从<key1>移动到 <key2> sinter <key1> <key2> 返回两个集合的交集元素 sunion <key1> <key2> 返回两个集合的并集元素 sdiff <key1> <key2> 返回两个集合的差集元素(包含key1,不包含key2)
- 底层结构
底层使用hash结构
127.0.0.1:6379> sadd k1 12 23 12 45 24 (integer) 4 #是否存在 127.0.0.1:6379> sismember k1 3 (integer) 0 127.0.0.1:6379> sismember k1 12 (integer) 1 127.0.0.1:6379> sismember k3 1 (integer) 0 # 查看 127.0.0.1:6379> smembers k1 1) "12" 2) "24" 3) "45" # 删除操作 127.0.0.1:6379> srem k1 3 (integer) 0 127.0.0.1:6379> scard k1 (integer) 3 127.0.0.1:6379> srem k1 3 12 (integer) 1 127.0.0.1:6379> scard k1 (integer) 2
5. Hash
- 特点
- 键值对的集合
- 一个string类型的field和value的映射表,hash特别适合用于存储对象
- 常见命令
hset <key> <field> <value> 给<key>集合中的<field>键赋值<value> hget <key> <field> 获取<key>集合中的<field>键的值<value> hmset <key> <field1> <value1> <field2> <value2> ... 批量给<key>集合中的<field>键赋值<value> hexists <key> <field> 查看元素是否存在 hkeys <key> 列出当前key的所有 field hvals <key> 列出当前key的所有value hincrby <key> <field> <increment> 为field的值添加增量<increment>,仅限于数值类型 hsetnx <key> <field> <value> 给<key>集合中的<field>键赋值<value>,仅当field不存在的时候
- 数据结构
- 数据量比较短且少的时候,使用zipList
- 数据量比较多的时候,使用hashtable
127.0.0.1:6379> hmset k1 id 1 name jack age 24 OK 127.0.0.1:6379> hkeys k1 1) "id" 2) "name" 3) "age" 127.0.0.1:6379> hincrby k1 age -2 (integer) 22 127.0.0.1:6379> hvals k1 1) "1" 2) "jack" 3) "22"
6. Zset(sorted set)
- 特点
- 没有重复元素的字符串集合
- 每个成员都关联一个评分(score),并以此进行升序排列,评分值可以重复
- 常用命令
zadd <key> <score1> <value1> <score2> <value2> ... 将一个或多个member元素加入的到有序key当中 zrange <key> <start> <stop> [withscores] 返回有序集key中,下标在start-stop之间的元素,是否返回分数 zrangebyscore key min max [withscores] [limit offset count] 返回指定分数区间的元素 zincrby <key> <incrment> <value> 为元素<value>添加增量 zrem <key> <value> zcount <key> <min> <max> 统计在指定分数区间内的元素 zrank <key> <value> 返回该值在集合中的排名,从0开始
- 底层结构
- hash结构:可以像Map<String,Double> 赋予权重,并像TreeSet内部按照权重排序
- 跳跃表:通过给元素value排序,根据权重获取元素的列表
逐层细化查找范围
127.0.0.1:6379> zadd k1 23 jack 22 rose 42 jerry (integer) 3 127.0.0.1:6379> zrange k1 0 -1 1) "rose" 2) "jack" 3) "jerry" 127.0.0.1:6379> zrange k1 0 -1 withscores 1) "rose" 2) "22" 3) "jack" 4) "23" 5) "jerry" 6) "42" 127.0.0.1:6379> zrange k1 (22 40 byscore 1) "jack" 127.0.0.1:6379> zrange k1 40 (22 byscore rev 1) "jack" 127.0.0.1:6379> zincrby k1 2 40 "2" 127.0.0.1:6379> zrange k1 0 -1 1) "40" 2) "rose" 3) "jack" 4) "jerry" 127.0.0.1:6379> zcount k1 -inf +inf (integer) 4 127.0.0.1:6379> zrank k1 jack (integer) 2
这篇关于Redis学习笔记二(常用五大数据类型)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-24Redis资料:新手入门快速指南
- 2024-12-24Redis资料:新手入门教程与实践指南
- 2024-12-24Redis资料:新手入门教程与实践指南
- 2024-12-07Redis高并发入门详解
- 2024-12-07Redis缓存入门:新手必读指南
- 2024-12-07Redis缓存入门:新手必读教程
- 2024-12-07Redis入门:新手必备的简单教程
- 2024-12-07Redis入门:新手必读的简单教程
- 2024-12-06Redis入门教程:从安装到基本操作
- 2024-12-06Redis缓存入门教程:轻松掌握缓存技巧