[Redis入门-02]数据类型

五大基本数据类型

Redis-Key

1.keys 查找所有符合给定模式pattern的key。 
格式: keys pattern ? 匹配单个字符 [ ] 匹配括号内的某1个字符 \ 转义字符
keys * #匹配数据库中所有key。
keys h?llo #可以匹配hello、hallo、hbllo等。
keys h*llo #可以匹配hllo、hello、heello等。
keys h[a,e]llo #只能匹配hallo和hello
 
2.del 删除给定的一个或多个key。 
格式: del key [key1 key2....]
del test1 #删除单个key
del test2 test3 #删除多个key
 
3.type 返回指定key的value类型 
格式: type key
 
4. exists 检查指定key是否存在,存在返回存在数量,否则0 
格式:exists key [key1 key2 ...]
 
5. randomkey 从当前数据库中随机返回一个key,如果没有返回null
 
6. expire 用于设置key的过期时间,过期后不可用,单位秒 
格式:expire key seconds
 
7. pexpireat 以毫秒为单位设置 key 的过期时间 
格式:pexpireat key milliseconds-timestamp 
pexpireat name 100000
 
8.ttl 以秒为单位,返回key的剩余生命周期,key不存在返回-2 key存在但没设置剩余时间,返回-1 
格式:ttl key
 
9. pttl 和ttl类似,但以毫秒单位返回
 
10. persist 移除给定 key 的生存时间,将这个 key 从带生存时间的key 转换成持久化的key(一个不带生存时间、永不过期的 key )。 
格式:persist key
 
11. rename 将 key 改名为 newkey 。当 key 和 newkey 相同,或者 key 不存在时,返回一个错误。当 newkey 已经存在时, RENAME 命令将覆盖旧值 
格式:rename key newkey
 
12. renamenx 当且仅当 newkey 不存在时,将 key 改名为 newkey 。当 key 不存在时,返回一个错误。
 
13. move 将当前数据库的 key 移动到给定的数据库 db 当中。如果当前数据库(源数据库)和给定数据库(目标数据库)有相同名字的给定 key ,或者key 不存在于当前数据库,那么 MOVE 不会生效。 
格式:move key db
 
14. dump 序列化给定 key ,并返回被序列化的值,使用 RESTORE 命令可以将这个值反序列化为Redis 键。 
格式:dump key
 
15. restore 反序列化给定的序列化值,并将它和给定的 key 关联。参数 ttl 以毫秒为单位为 key 设置生存时间;如果 ttl 为 0 ,那么不设置生存时间。 
格式: restore key ttl serialized-value [REPLACE]
例:
127.0.0.1:6379> set name 'redis'
OK
127.0.0.1:6379> dump name
"\x00\x05redis\b\x00|}ENK67\x19" 127.0.0.1:6379> restore name-new 0 "\x00\x05redis\b\x00|}ENK67\x19"
OK
127.0.0.1:6379> get name-new
"redis"

 

String

 
1. append 追加字符串,如果key不存在,就会set一个key
格式:append key value
 
2. strlen 获取字符串的长度
 
增减操作:
3. incr / decr  将key中存储的字符串加一/减一
 
4. incrby / decrby 将key中字符加指定
格式:incrby key increment
 
字符串范围:
5. getrange
格式:getrange key start end
例:
127.0.0.1:6379> set name helloworld
OK
127.0.0.1:6379> getrange name 0 3             #截取字符串[0,3]
"hell"
127.0.0.1:6379> getrange name 0 -1            #截取全部字符串
"helloworld"
 
6. setrange 从指定位置替换字符串
格式:SETRANGE KEY_NAME OFFSET VALUE
 
7.setex (set with expire)  指定的 key 设置值及其过期时间。如果 key 已经存在, SETEX 命令将会替换旧的值
格式:SETEX KEY_NAME TIMEOUT VALUE
   
8.setnx (set if not exists) 不存在设置,key存在时不会覆盖,在分布式锁中经常使用
格式:SETNX KEY_NAME VALUE
 
批量获取/设置:
9. mset k1 v1 k2 v2 ... 设置多个值
   msetnx    原子性操作,要么一起成功要么一起失败
 
对象:使用key巧妙保存对象 而不是json字符串  user:{id}:{field}
127.0.0.1:6379> mset user:1:name chase user:1:age 20
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "chase"
2) "20"
 
10. mget k1 k2 ...
 
11.getset 如果不存在返回nil,存在返回旧值并设置新值
格式:getset key value
 
String的使用场景:value除了是字符串以外还可以是数字  
  • 计数器
  • 统计多单位数量
  • 粉丝数
  • 对象缓存存储
 

List

在Redis中,可以把List当做栈、队列、阻塞队列
所有list命令都是由 "l" 开头的。
插入
1. lpush 将一个值或多个值插入列表头部 (左)
格式:lpush key value [value ...]
 
2. rpush 将一个值或多个值插入列表尾部 (右)
 
3. rpushx 为已存在列表添加值,添加尾部(右)
 
4. lrange 通过区间获取list的值
格式:lrange key start end
lrange key 0 1 获取 [0,1]区间的值
lrange key 0 -1 获取所有值
 
移除
5. lpop 移除并返回列表的第一个元素
 
6. rpop 移除并返回列表的最后一个元素 
 
7. lrem 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。
count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
count = 0 : 移除表中所有与 VALUE 相等的值。
格式:LREM  KEY_NAME  COUNT  VALUE
 
8. ltrim 修剪,只保留指定区间内的元素,也可以使用负数下标
格式:ltrim key start end
例:
127.0.0.1:6379> ltrim new 1 2   保留[1,2]区间的元素
OK
 
9. lindex 通过索引获取列表元素 也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。 
格式:lindex key index
 
10. llen 获取列表长度
 
11. rpoplpush 移除列表的最后一个元素,并将该元素添加到另一个(新的)列表并返回。
格式:rpoplpush source destination
例:
127.0.0.1:6379> lrange new 0 -1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> rpoplpush new new1
"a"
127.0.0.1:6379> keys *
1) "new"
2) "new1"
127.0.0.1:6379>
 
12. lset 通过索引来设置(更新)元素的值,前提是列表,对应下标元素存在,否则报错
格式: lset key index value
 
13. linsert  在指定元素前|后插入元素
格式:linsert key before|after pivot element
例:
127.0.0.1:6379> lpush new a b c d
(integer) 4
127.0.0.1:6379> linsert new before c bandc
(integer) 5
127.0.0.1:6379>
 
 
阻塞:
14. blpop 移出并获取列表的第一个元素(左), 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 返回的是list的key和弹出的元素
格式:blpop  key  [key ...]  timeout
例:
127.0.0.1:6379> lrange new 0 -1     # 此时lis中有三个元素
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> blpop new 5        
1) "new"
2) "c"
127.0.0.1:6379> blpop new 5
1) "new"
2) "b"
127.0.0.1:6379> blpop new 5
1) "new"
2) "a"
127.0.0.1:6379> blpop new 5           #如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
(nil)
(5.03s)
127.0.0.1:6379>
 
 
15. brpop 和 blpop类似,(阻塞)溢出列表最后一个元素(右)

Set(集合)

Set中的值是不能重复的,Set操作都是 s 开头的
Set随机,不重复
1. sadd 将一个或多个元素加到set集合中
格式:sadd  key  value [value ...]
 
2. srem 移除指定set中的一个或多个指定元素
格式:key member [member...]
 
3. smembers 返回集合中所有成员
 
4. sismember 判断某个元素是否在set中
格式:sismember key value 
 
5. scard 获取set集合中元素的个数
 
6. srandmember 随机从set中获取指定count个数个成员
格式:srandmember key connt
 
7. spop 随机移除集合中的元素 返回这个被移除的元素
 
8. smove 把一个集合中指定的元素移动到另一个结合
格式:smove source destination member
例:
127.0.0.1:6379> smembers newset
1) "haha"
127.0.0.1:6379> smembers myset
1) "work"
2) "job"
3) "car"
4) "samsung"
127.0.0.1:6379> smove myset newset car      # 将 car 这个元素 从myset集合移动到 newset集合
(integer) 1
127.0.0.1:6379> smembers myset
1) "work"
2) "job"
3) "samsung"
127.0.0.1:6379> smembers newset
1) "car"
2) "haha"
127.0.0.1:6379>
 
交集/差集/并集
9. sdiff 返回集合之间的差集,不存在的集合视为空集
格式:sdiff key [key ...]
 
10.sinter 返回结合之间的交集,不存在的key视为空集,当有一个空集时,结果也为空集
格式 sinter key [key ...]
 
11. sunion 返回集合的并集
 
交集/差集/并集存储
12. sdiffstore 差集存储在 destination集合中如果指定的集合 key 已存在,则会被覆盖
格式: sdiffstore destination key [key...]
 
13. sinterstore
 
14. sunionstore
 
15. sscan 迭代集合中元素
格式:sscan key cursor [match pattern] [count count]
例:
127.0.0.1:6379> sadd test car1 cars carsss carrer cc
(integer) 5
127.0.0.1:6379> sscan test 0 match 'c*' count 1
1) "2"
2) 1) "carrer"
   2) "cc"

 

Hash(哈希)

Map集合, key-map 这时候的值是一个map集合
所有的hash命令是以 h 开头的
set/get:
1. hset 为哈希表中的字段赋值
格式: hset key field value [fileld value ...]
 
2. hmset 同时将多个field-value值设置到哈希表
格式: hmset key field value [field value ...]
 
3. hsetnx 只有在字段 field 不存在时,设置哈希表字段的值。
格式:hsetnx key field value
 
4. hget 获取给定字段的值
 
5. hmget 获取多个给定字段的值
格式:hmget key field [field ...]
 
6. hgetall 获取所有的键值对
 
7. hdel 删除指定的field
格式:hdel key field [field...]
 
8. hlen 获取哈希表中字段的数量
 
9. hexist 判断哈希表中指定字段是否存在
格式:hexists key field
 
获取所有
10. hkeys 只获取所有的key
 
11. hvals 只获取所有的value
 
增加/减少
12. hincrby 为哈希表 key 中的指定字段的整数值加上增量 increment
格式:hincrby key field increment
 
13. hincrbyfloat 为哈希表 key 中的指定字段的浮点数值加上增量 increment
格式: hincrbyfloat key field increment
例:
127.0.0.1:6379> hvals newhash 1) "worker" 2) "1000" 127.0.0.1:6379> HINCRBYFLOAT newhash salary 0.567 "1000.567"

Zset(有序集合)

在Set的基础上增加了一个值。一个score
常用指令如下:
添加/删除
1. zadd 将一个或多个成员元素及其分数值加入到有序集当中
格式: zadd key score1 value1 score2 value2
例:
127.0.0.1:6379> zadd myset 1 one
(integer) 1
127.0.0.1:6379> zadd myset 2 two 3 three
(integer) 2
 
2. zrem 移除一个或多个成员(需要指定成员,而不是score)
格式:zrem key member [member...]
 
3. zrange 返回有序集合中指定区间内的成员(从小到大排序 正序) (以0表示第一个成员 -1表示最后一个成员 -2表示倒数第二个 以此类推)
格式:zrange key start end [withscores]
例:
127.0.0.1:6379> zrange myset 0 -1      #获取所有成员
 
4. zrevrange 从大到小排序 和上面用法一样
格式:zrevrange key start end [withscores]
 
5. Zrangebyscore 排序指定区间内分数的成员
格式:zrangebyscore  key  min  max  [WITHSCORES] [LIMIT offset count]
例:
redis 127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf     # 显示整个有序集
1) "jack"
2) "tom"
3) "peter"
redis 127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf WITHSCORES     # 显示整个有序集及成员的 score 值
1) "jack"
2) "2500"
3) "tom"
4) "5000"
5) "peter"
6) "12000"
redis 127.0.0.1:6379> ZRANGEBYSCORE salary -inf 5000 WITHSCORES     # 显示工资 <=5000 的所有成员
1) "jack"
2) "2500"
3) "tom"
4) "5000"
redis 127.0.0.1:6379> ZRANGEBYSCORE salary (5000 400000     # 显示工资大于 5000 小于等于 400000 的成员
1) "peter"
 
6. zcard 获取集合中的个数
 
7. zcount 获取指定区间成员数量 (-inf表示负无穷 +inf表示正无穷)
格式:zcount key min max
 
8. zrank 返回有序集中指定成员的排名 (有序集按从小到大排序)
格式:zrank key member
 
9. zrevrank 返回有序集中指定成员的排名 (有序集按从大到小排序) 
 
 

三种特殊数据类型 

Geospatial(地理位置)

地理位置在Redis3.2推出,可以推算地理位置信息,两地之间举例,方圆几里的人等应用场景。
1. geoadd 添加地理位置
格式:geoadd key longitude latitude member [longitude latitude member ...]
规则:两极无法直接添加,一般会通过Java程序将城市数据一次性导入
          参考:key 经度 纬度 名称
 
2.  geopos 从key返回所指定元素的位置 (经度和纬度)
格式: geopos key member [member ...]
例:
127.0.0.1:6379> GEOPOS china:city beijing
1) 1) "116.39999896287918091"                        #经度
   2) "38.99999918434559731"                         #纬度
 
 
3. geodist 返回给定两个位置之间的距离
格式: geodist key member1 member2 [m|km|ft|mi]
m 表示单位为米。
km 表示单位为千米。
mi 表示单位为英里。
ft 表示单位为英尺。
例:
127.0.0.1:6379> GEODIST china:city chongqing Shanghai km
"1458.9191"
127.0.0.1:6379> GEODIST china:city chongqing Shanghai m
"1458919.1348"
 
4. georadius 以给定经纬度为中心 返回key内元素中 与中心的距离不超过给定最大距离的所有位置元素。
格式: georadius  key  longitude  latitude  radius m|km|ft|mi  [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
 
count获取指定数量
 
WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。
WITHCOORD: 将位置元素的经度和维度也一并返回。
返回值说明:
在没有给定任何 WITH 选项的情况下, 命令只会返回一个像 [“New York”,”Milan”,”Paris”] 这样的线性(linear)列表。
在指定了 WITHCOORD 、 WITHDIST 、 WITHHASH 等选项的情况下, 命令返回一个二层嵌套数组, 内层的每个子数组就表示一个元素。
在返回嵌套数组时, 子数组的第一个元素总是位置元素的名字。 至于额外的信息, 则会作为子数组的后续元素, 按照以下顺序被返回:
1. 以浮点数格式返回的中心与位置元素之间的距离, 单位与用户指定范围时的单位一致。
2. geohash 整数。
3. 由两个元素组成的坐标,分别为经度和纬度。
 
举个例子, GEORADIUS Sicily 15 37 200 km WITHCOORD WITHDIST 这样的命令返回的每个子数组都是类似以下格式的:
["Palermo","190.4424",["13.361389338970184","38.115556395496299"]]
 
5.  georadiusbymember 找出位于指定元素周围的其他元素
格式:GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
 
使用Zset的命令操作GEO。
 
 

Hyperloglog

什么是基数?
A = {1,3,5,7,8,7}
B = {1,3,5,7,8}
基数(不重复的元素的个数) = 5 可以接受误差
 
简介:
Redis2.8.9版本更新了Hyperloglog的数据结构
Redis Hyperloglog基数统计算法
 
优点:占用内存是固定的,2^64个不同元素的基数,只要占用12kb内存 如果要从内存角度比较 Hyperloglog首选
0.81%错误率
案例:
网页的UV(一个人访问一个网站多次,还是算作一个人)
传统方式:用set保存用户id 然后统计set元素数量作为标准判断,这个方式保存大量用户id就比较麻烦,目的是为了计数,而不是保存id
Redis:0.81%错误率可以忽略不计
1. pfadd 将所有元素参数添加到 HyperLogLog 数据结构中。
格式:pfadd key value [value...]
 
2. pfcount 命令返回给定 (可以是多个的) HyperLogLog 的基数估算值
格式:pfcount key [key...]
 
3.pfmerge 将多个 HyperLogLog 合并为一个 HyperLogLog ,合并后的 HyperLogLog 的基数估算值是通过对所有 给定 HyperLogLog 进行并集计算得出的。
格式:pfmerge destkey sourceKey [sourceKey ...]

Bitmaps

位存储
统计用户信息,活跃,不活跃,登录,未登录,打卡,365天打卡,两个状态的,都可以使用Bitmaps
Bitmaps位图数据结构,都是操作二进制位来记录,就只有0和1两个状态。
 
1. setbit 设置一个位置的bit
格式:setbit key offset value
例:记录一周打卡
127.0.0.1:6379> SETBIT sign 0 1
(integer) 0
127.0.0.1:6379> SETBIT sign 1 1
(integer) 0
127.0.0.1:6379> SETBIT sign 2 0
(integer) 0
127.0.0.1:6379> SETBIT sign 3 1
(integer) 0
......
127.0.0.1:6379> SETBIT sign 7 1
(integer) 0
 
2. getbit 获取
格式:getbit key offset
 
3.bitcount 统计比特位为1的
格式:bitcount key [start end]

 

 
 
 
 
 
 
posted @ 2020-12-14 21:04  OldCha  阅读(141)  评论(0)    收藏  举报