ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Redis学习笔记二(常用五大数据类型)

2022-06-19 00:34:38  阅读:181  来源: 互联网

标签:127.0 0.1 数据类型 Redis 笔记 6379 k1 key integer


1. 键(key)

  1. 命令
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	清空所有库
  1. 测试
#添加键值
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

  1. 二进制安全,可以存放任何数据,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>	设置新值,并返回旧值
  1. 所有操作都是原子操作:不会被线程调度机制打断
    java的自加加操作不是原子操作,i++:可以分为i+1,和i = i+1,多个线程的话,两步可能被打断,导致加一和赋值不是同一个值

  2. 数据结构为简单动态字符串,可以修改,类似java的ArrayList,采用预分配冗余空间的方式,减少频繁内存空间分配

    1. 字符串长度小于1M时,扩容都是加倍现有的空间;
    2. 大于1M时,每次扩容1M;
    3. 最大不能超过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

单键多值

  1. 可以在头部和尾部添加元素
  2. 常用命令
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值(超过则删除全部相同值)
  1. 具体的底层数据结构
    快速链表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

  1. 特点
    • 自动去重
    • 提供了判断某元素是否存在的接口
    • 无序集合,底层是value为null的hash表
    • 添加,删除,查找,复杂度都是O(1)
  2. 常用命令
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)
  1. 底层结构
    底层使用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

  1. 特点
    • 键值对的集合
    • 一个string类型的field和value的映射表,hash特别适合用于存储对象
  2. 常见命令
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不存在的时候
  1. 数据结构
    • 数据量比较短且少的时候,使用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)

  1. 特点
    • 没有重复元素的字符串集合
    • 每个成员都关联一个评分(score),并以此进行升序排列,评分值可以重复
  2. 常用命令
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开始
  1. 底层结构
    1. hash结构:可以像Map<String,Double> 赋予权重,并像TreeSet内部按照权重排序
    2. 跳跃表:通过给元素value排序,根据权重获取元素的列表
      image
      逐层细化查找范围
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

标签:127.0,0.1,数据类型,Redis,笔记,6379,k1,key,integer
来源: https://www.cnblogs.com/sleepyheadLK/p/16389689.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有