Redis的数据类型

基础

Redis默认有16个数据库
在这里插入图片描述
默认数据库是 0
默认端口号是 6379
redis-cli基础命令:

  1. select [index] 选择数据库
  2. keys [pattern] 显示keys值
  3. set [key] [value] 设置kv
  4. get [key] 查看key的值
  5. del key 删除key
  6. flushdb 清空当前数据库的值
  7. flushall 清空所有数据库的值
  8. EXPIRE key seconds 设置key的过期时间
  9. TTL key 查看key的过期时间,-1代表没有设置,-2代表已过期
  10. type key 查看key的类型
127.0.0.1:6379> keys * 
1) "myhash"
2) "key:__rand_int__"
3) "mylist"
4) "counter:__rand_int__"
127.0.0.1:6379> FLUSHDB 
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> SELECT 1
OK
127.0.0.1:6379[1]> keys *
(empty array)
127.0.0.1:6379[1]> set name kong
OK
127.0.0.1:6379[1]> get name
"kong"
127.0.0.1:6379[1]> keys *
1) "age"
2) "name"
127.0.0.1:6379[1]> type age
string
127.0.0.1:6379[1]> del age
(integer) 1
127.0.0.1:6379[1]> keys *
1) "name"
127.0.0.1:6379[1]> select 2
OK
127.0.0.1:6379[2]> FLUSHdb
OK
127.0.0.1:6379[2]> select 1
OK
127.0.0.1:6379[1]> keys *
1) "name"
127.0.0.1:6379[1]> select 2
OK
127.0.0.1:6379[2]> FLUSHALL
OK
127.0.0.1:6379[2]> SELECT 1
OK
127.0.0.1:6379[1]> keys *
(empty array)
127.0.0.1:6379[1]> TTL name
(integer) -1
127.0.0.1:6379[1]> EXPIRE name 10
(integer) 1
127.0.0.1:6379[1]> ttl name
(integer) 8
127.0.0.1:6379[1]> ttl name
(integer) 5
127.0.0.1:6379[1]> ttl name
(integer) -2

Redis keys

key值是二进制安全的,这意味着可以用任何二进制序列作为key值,从形如”foo”的简单字符串到一个JPEG文件的内容都可以。空字符串也是有效key值。

关于key的几条规则:

太长的键值不是个好主意,例如1024字节的键值就不是个好主意,不仅因为消耗内存,而且在数据中查找这类键值的计算成本很高。
太短的键值通常也不是好主意,如果你要用”u:1000:pwd”来代替”user:1000:password”,这没有什么问题,但后者更易阅读,并且由此增加的空间消耗相对于key
object和value object本身来说很小。当然,没人阻止您一定要用更短的键值节省一丁点儿空间。
最好坚持一种模式。例如:”object-type: id:field”就是个不错的注意,像这样”user:1000:password”。我喜欢对多单词的字段名中加上一个点,就像这样:”comment: 1234:reply.to”。

所有API可以在官方文档查找,中文的比较快但是不一定最新。

数据类型

官方中文教程
官方互动式教程

  • string
# 关于 SET GET 的命令就省略了
127.0.0.1:6379[1]> set k1 hello,world
OK
127.0.0.1:6379[1]> get k1
"hello,world"

# 对于整数, Redis内置了自增自减的命令
127.0.0.1:6379[1]> set k4 1
OK
127.0.0.1:6379[1]> INCR k4 # 自增
(integer) 2
127.0.0.1:6379[1]> INCRBY k4 2 # 定义自增的量
(integer) 4
127.0.0.1:6379[1]> DECR k4 # 自减
(integer) 3
127.0.0.1:6379[1]> decrby k4 4 # 定义自减的量
(integer) -1

在这里插入图片描述
SETRANGE
GETRANGE
APPEND

127.0.0.1:6379[1]> get name
"kong"
127.0.0.1:6379[1]> SETRANGE name 0 hiukong
(integer) 7
127.0.0.1:6379[1]> get name
"hiukong"
127.0.0.1:6379[1]> GETRANGE name 0 2
"hiu"
127.0.0.1:6379[1]> APPEND name ,hello
(integer) 13

SETEX (SET WITH EXPIRE) 设置kv的同时设置过期时间
SETNX (SET IF NOT EXISTS)
PERSIST 撤销TTL ( if you SET a key, its TTL will be reset.)

127.0.0.1:6379[1]> keys *
(empty array)
127.0.0.1:6379[1]> set k1 v1
OK
127.0.0.1:6379[1]> setex k2 30 v2
OK
127.0.0.1:6379[1]> ttl k2
(integer) 26
127.0.0.1:6379[1]> PERSIST k2
(integer) 1
127.0.0.1:6379[1]> ttl k2
(integer) -1
127.0.0.1:6379[1]> setnx k2 "hello"
(integer) 0
127.0.0.1:6379[1]> get k2
"v2"

MSET(Multi-set) 在这里插入图片描述

MGET(multi-get)在这里插入图片描述
MSETNX 同上,不过是可以同时设置多个

127.0.0.1:6379[1]> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379[1]> MSETNX k1 new_v1 k4 v4 # 是一个原子性操作,要么全部成功要么全成功。
(integer) 0
127.0.0.1:6379[1]> mget k1 k2 k3 k4
1) "v1"
2) "v2"
3) "v3"
4) (nil)

String类型的使用场景:

  1. value除了是字符串也可以是数字
  2. 做计数器,统计浏览数…
  • Lists
    Redis列表是简单的字符串列表,按照插入顺序排序。 你可以添加一个元素到列表的头部(左边)或者尾部(右边)。因此可以做成栈、队列、阻塞队列。

命令
LPUSH 从左边/头部插入元素
RPUSH 从右边/尾部插入元素
LLEN 返回list长度
LRANGE 返回list的元素
LPOP 从左边/头部弹出元素
RPOP 从右边/尾部弹出元素
LINDEX 通过下标获取元素

127.0.0.1:6379[1]> LPUSH list hello
(integer) 1
127.0.0.1:6379[1]> LPUSH list world
(integer) 2
127.0.0.1:6379[1]> RPUSH list kong
(integer) 3
127.0.0.1:6379[1]> LLEN
(error) ERR wrong number of arguments for 'llen' command
127.0.0.1:6379[1]> LLEN list
(integer) 3
127.0.0.1:6379[1]> LRANGE list 0 -1
1) "world"
2) "hello"
3) "kong"
127.0.0.1:6379[1]> RPOP list 
"kong"
127.0.0.1:6379[1]> LRANGE list 0 -1
1) "world"
2) "hello"
127.0.0.1:6379[1]> LPOP list
"world"
127.0.0.1:6379[1]> LINDEX list 0
"hello"

在这里插入图片描述
List还是很好理解的.之后就不画图了

LREM key count element 可以指定对应的值和删除的个数

127.0.0.1:6379[1]> lrange list 0 -1
1) "hello"
2) "world!"
3) "test"
4) "test"
5) "hello"
127.0.0.1:6379[1]> lrem list 1 hello # 删除1个 hello
(integer) 1
127.0.0.1:6379[1]> lrange list 0 -1
1) "world!"
2) "test"
3) "test"
4) "hello"
127.0.0.1:6379[1]> lrem list 2 test # 删除2个 test
(integer) 2
127.0.0.1:6379[1]> lrange list 0 -1
1) "world!"
2) "hello"

LTRIM key start stop 截取指定位置的list,保留修改后的list

127.0.0.1:6379[1]> LPUSH list hello world test trim
(integer) 4
127.0.0.1:6379[1]> lrange list 0 -1
1) "trim"
2) "test"
3) "world"
4) "hello"
127.0.0.1:6379[1]> LTRIM list 0 1 # 截取第一个到第二个
OK
127.0.0.1:6379[1]> lrange list 0 -1
1) "trim"
2) "test"

RPOPLPUSH source destination 组合命令,右弹出然后左插入

127.0.0.1:6379[1]> RPUSH list hello world test rpoplpush
(integer) 4
127.0.0.1:6379[1]> LRANGE list
(error) ERR wrong number of arguments for 'lrange' command
127.0.0.1:6379[1]> LRANGE list 0 -1
1) "hello"
2) "world"
3) "test"
4) "rpoplpush"
127.0.0.1:6379[1]> RPOPLPUSH list newList
"rpoplpush"
127.0.0.1:6379[1]> LRANGE list 0 -1
1) "hello"
2) "world"
3) "test"
127.0.0.1:6379[1]> LRANGE newList 0 -1
1) "rpoplpush"

LSET key index element 改变指定下标的值,如果key不存在或者是index越界则会报错

127.0.0.1:6379[1]> LSET list 0 hi
OK
127.0.0.1:6379[1]> lrange list 0 -1
1) "hi"
2) "world"
3) "test"
127.0.0.1:6379[1]> lset List 0 hi
(error) ERR no such key
127.0.0.1:6379[1]> lset list 3 test
(error) ERR index out of range

LINSERT key BEFORE|AFTER pivot element 在指定位置的前/后插入值

127.0.0.1:6379[1]> LINSERT list before hi nihao
(integer) 4
127.0.0.1:6379[1]> lrange list 0 -1
1) "nihao"
2) "hi"
3) "world"
4) "test"

可以看出其实List基本就是linked List结构,在两边插入和改动值的时候效率最高

  • Sets
    Redis集合是一个无序的不重复的字符串合集。你可以以O(1) 的时间复杂度(无论集合中有多少元素时间复杂度都为常量)完成 添加,删除以及测试元素是否存在的操作。

SADD key member [member …] 往set里面添加元素
SREM key member [member …] 删除set中的元素
SCARD key 返回set中的元素个数
SMEMBERS key 查看set中的元素
SISMEMBER key member 查看set中是否存在[member]元素

127.0.0.1:6379> SMEMBERS myset # 查看set中成员
1) "xiaohong"
2) "xiaoming"
3) "lisi"
4) "zhangsan"
--------------------------------------------------------------------
127.0.0.1:6379> SCARD myset
(integer) 4
--------------------------------------------------------------------
127.0.0.1:6379> SISMEMBER myset lisi # 检查set中是否存在'lisi'
(integer) 1 # 存在返回1
127.0.0.1:6379> SISMEMBER myset wangwu # 检查set中是否存在'wangwu'
(integer) 0 # 不存在返回0
--------------------------------------------------------------------
127.0.0.1:6379> SREM myset lisi
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "xiaohong"
2) "xiaoming"
3) "zhangsan"

SRANDMEMBER key [count] 随机抽取set中x个元素

127.0.0.1:6379> SRANDMEMBER myset 1
1) "zhangsan"
127.0.0.1:6379> SRANDMEMBER myset 1
1) "xiaohong"
127.0.0.1:6379> SRANDMEMBER myset 2
1) "xiaohong"
2) "zhangsan"

SPOP key [count] 随机删除set中x个元素
SMOVE source destination member 将某一元素移动到另一个set中

127.0.0.1:6379> SMEMBERS myset
1) "wangwu"
2) "lisi"
3) "xiaoming"
4) "xiaohong"
5) "liuxing"
6) "zhangsan"
127.0.0.1:6379> SPOP myset
"wangwu"
127.0.0.1:6379> SPOP myset
"liuxing"
127.0.0.1:6379> SPOP myset
"xiaoming"
127.0.0.1:6379> SMOVE myset myset2 lisi
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "xiaohong"
2) "zhangsan"
127.0.0.1:6379> SMEMBERS myset2
1) "lisi"

集合中的操作: 交集, 并集, 差集

127.0.0.1:6379> sadd myset1 a b c d
(integer) 4
127.0.0.1:6379> SADD myset2 c d e f
(integer) 4
--------------------------------------------------------------------
127.0.0.1:6379> SDIFF myset1 myset2 # 差集
1) "a"
2) "b"
--------------------------------------------------------------------
127.0.0.1:6379> SINTER myset1 myset2 # 交集 (共同好友)
1) "c"
2) "d"
--------------------------------------------------------------------
127.0.0.1:6379> SUNION myset1 myset2 # 并集
1) "c"
2) "a"
3) "f"
4) "e"
5) "b"
6) "d"
  • Hashes
    Redis hashes look exactly how one might expect a “hash” to look, with field-value pairs
    看起来是key-Map这种样子的

    命令和String的差不多,命令用H开头

HMSET key field value [field value …]
HMGET key field [field…]
HGETALL key
HDEL key field [field…]
HLEN key
HEXISTS key field
HKEYS key
HVALS key
HINCRBY key field increment
HSETNX key field value

127.0.0.1:6379> hmset user:100 username kong birtyear 1997 verified 1
OK
--------------------------------------------------------------------
127.0.0.1:6379> HMGET user:100 username birtyear
1) "kong"
2) "1997"
--------------------------------------------------------------------
127.0.0.1:6379> hgetall user:100
1) "username"
2) "kong"
3) "birtyear"
4) "1997"
5) "verified"
6) "1"
--------------------------------------------------------------------
127.0.0.1:6379> HDEL user:100 verified
(integer) 1
127.0.0.1:6379> HGETALL user:100
1) "username"
2) "kong"
3) "birtyear"
4) "1997"
--------------------------------------------------------------------
127.0.0.1:6379> HLEN user:100
(integer) 2
--------------------------------------------------------------------
127.0.0.1:6379> HEXISTS user:100 username
(integer) 1
--------------------------------------------------------------------
127.0.0.1:6379> HKEYS user:100
1) "username"
2) "birtyear"
127.0.0.1:6379> HVALS user:100
1) "kong"
2) "1997"
--------------------------------------------------------------------
127.0.0.1:6379> HSET user:100 money 100
(integer) 1
127.0.0.1:6379> HINCRBY user:100 money 10
(integer) 110
127.0.0.1:6379> HINCRBY user:100 money -80
(integer) 30
--------------------------------------------------------------------
127.0.0.1:6379> HSETNX user:100 username hiu
(integer) 0
127.0.0.1:6379> HSETNX user:100 secondname hiu
(integer) 1

Hash适合去存储一些需要变更的数据,hash更适合用于存储对象,string用于存储字符串。

  • Sorted sets or ZSet
    有序集合Zset类似于Set和Hash,他和Set一样是不重复的字符串集合,同时又像Hash一样有一个浮点型数值score的映射,所以Zset像是set和hash的混合。

    Zset的排序规则:
    - A.score > B.score, 则 A>B
    - 如果A和B的分数完全相同,则A字符串在字典上大于B字符串,则A>B

ZADD key [NX|XX] [CH] [INCR] score member [score member …]
ZRANGE
ZRANBYSCORE 降序显示
ZREVRANGE 升序显示
ZCARD 显示个数
ZREM 移除元素

127.0.0.1:6379> ZADD hackers 1940 "zhangsan"
(integer) 1
127.0.0.1:6379> ZADD hackers 1957 "lisi"
(integer) 1
127.0.0.1:6379> ZADD hackers 1980 "wangwu"
(integer) 1
127.0.0.1:6379> ZADD hackers 1987 "xiaoming"
(integer) 1
127.0.0.1:6379> ZADD hackers 1967 "xiaoli"
(integer) 1
--------------------------------------------------------------------
127.0.0.1:6379> ZRANGE hackers 0 -1 # 查看所有的值
1) "zhangsan"
2) "lisi"
3) "xiaoli"
4) "wangwu"
5) "xiaoming"
--------------------------------------------------------------------
127.0.0.1:6379> ZRANGEBYSCORE hackers -inf +inf  withscores # 查看从负无穷到正无穷的值,并显示score
 1) "zhangsan"
 2) "1940"
 3) "lisi"
 4) "1957"
 5) "xiaoli"
 6) "1967"
 7) "wangwu"
 8) "1980"
 9) "xiaoming"
10) "1987"
127.0.0.1:6379> ZREVRANGE hackers 0 -1 withscores # 降序显示
 1) "xiaoming"
 2) "1987"
 3) "wangwu"
 4) "1980"
 5) "xiaoli"
 6) "1967"
 7) "lisi"
 8) "1957"
 9) "zhangsan"
10) "1940"
--------------------------------------------------------------------
127.0.0.1:6379> zrange hackers 0 -1
1) "zhangsan"
2) "lisi"
3) "xiaoli"
4) "wangwu"
5) "xiaoming"
127.0.0.1:6379> ZREM hacker zhangsan
(integer) 0
127.0.0.1:6379> zrange hackers 0 -1
1) "zhangsan"
2) "lisi"
3) "xiaoli"
4) "wangwu"
5) "xiaoming"
--------------------------------------------------------------------
127.0.0.1:6379> ZCARD hackers
(integer) 5

zcount key min max 判断闭区间内的数值个数

127.0.0.1:6379> ZCOUNT hackers 1960 1980
(integer) 2

Zset案例:
- 1.班级表/薪资表
- 2.排行榜更新

  • geospatial GEO 地理位置
    GEO只有6个命令

    GEOADD key longitude latitude member [longitude latitude member …] key 经度 纬度 名字
    GEOHASH 返回一个11个字符的字符串geohash
    GEOPOS key member [member] 返回地址的经纬度
    GEODIST key member1 member2 [m|km|ft|mi] 返回两个地址的距离(米,千米,英里,英尺)
    GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]
    以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
    GEORADIUSBYMEMBER key member radius m|km|ft|mi 找出指定元素周围的元素

127.0.0.1:6379> GEOADD china:city 114.085947 22.547 shenzhen
(integer) 1
127.0.0.1:6379> GEOADD china:city 113.122717 23.028762 foshan
(integer) 1
127.0.0.1:6379> GEOADD china:city 106.50 29.53 chongqing
(integer) 1
127.0.0.1:6379> GEOADD china:city 116.40 39.90 beijing 
(integer) 1
127.0.0.1:6379> GEOADD china:city 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 2
--------------------------------------------------------------------
127.0.0.1:6379> GEOPOS china:city foshan
1) 1) "113.1227150559425354"
   2) "23.02876171488941992"
127.0.0.1:6379> GEOPOS china:city foshan chongqing
1) 1) "113.1227150559425354"
   2) "23.02876171488941992"
2) 1) "106.49999767541885376"
   2) "29.52999957900659211"
127.0.0.1:6379> GEOPOS china:city foshan chongqing sichuan 
			# GEOPOS接受可变数量的member,如果不存在则返回nil
1) 1) "113.1227150559425354"
   2) "23.02876171488941992"
2) 1) "106.49999767541885376"
   2) "29.52999957900659211"
3) (nil)
--------------------------------------------------------------------
127.0.0.1:6379> GEODIST china:city foshan sichuan
(nil)
127.0.0.1:6379> GEODIST china:city foshan beijing 
"1901715.9264"
127.0.0.1:6379> GEODIST china:city foshan beijing km
"1901.7159"
--------------------------------------------------------------------
127.0.0.1:6379> GEORADIUS china:city 110 30 100 km withdist
(empty array)
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist
1) 1) "chongqing"
   2) "341.9374"
2) 1) "xian"
   2) "483.8340"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoord
1) 1) "chongqing"
   2) "341.9374"
   3) 1) "106.49999767541885376"
      2) "29.52999957900659211"
2) 1) "xian"
   2) "483.8340"
   3) 1) "108.96000176668167114"
      2) "34.25999964418929977"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withcoord withdist count 1
1) 1) "chongqing"
   2) "341.9374"
   3) 1) "106.49999767541885376"
      2) "29.52999957900659211"
--------------------------------------------------------------------
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km
1) "beijing"
2) "xian"
127.0.0.1:6379> GEORADIUSBYMEMBER china:city neimenggu 1000 km # 元素不存在
(error) ERR could not decode requested zset member
--------------------------------------------------------------------
127.0.0.1:6379> GEOHASH china:city foshan chongqing
1) "ws07n0m2q20"
2) "wm5xzrybty0"

GEO 原理: GEO底层是使用ZSet实现的,可以用ZSet的命令操作GEO

127.0.0.1:6379> ZRANGE china:city 0 -1
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "foshan"
5) "hangzhou"
6) "beijing"
127.0.0.1:6379> ZREM china:city foshan
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "beijing"
  • hyperloglogs 超日志
    一种统计基数的数据结构,该数据结构使用的算法可以用恒定内存来统计基数,而且误差不超过1%。譬如传统的统计UV的做法是使用Set来统计用户和ip,这样会浪费大量的内存。

PFADD key elements 新建
PFCOUNT key 统计基数
PFMERGE destkey sourcekey [sourcekey] 合并

127.0.0.1:6379> PFADD mykey1 a b c d e f g a
(integer) 1
127.0.0.1:6379> pfadd mykey2 h i j k l m n o
(integer) 1
127.0.0.1:6379> pfadd mykey2 a b c
(integer) 1
127.0.0.1:6379> PFCOUNT mykey1
(integer) 7
127.0.0.1:6379> PFCOUNT mykey2
(integer) 11
127.0.0.1:6379> PFMERGE mykey3 mykey1 mykey2
OK
127.0.0.1:6379> PFCOUNT mykey3
(integer) 15
  • bitmaps 位图
    任何只有两种状态的情景都可以使用位图,打卡签到、在线下线…
    位图不是实际的数据类型,而是在String类型上定义的一组面向位的操作。由于字符串是二进制安全Blob,并且最大长度为512 MB,因此它们适合设置多达2^32个不同的位。
    位图的最大优点之一是,它们在存储信息时通常可以节省大量空间。例如,在以增量用户ID表示不同用户的系统中,仅使用512 MB内存就可以记住40亿用户的一位信息(例如,知道用户是否要接收新闻通讯)。

SETBIT key offset value
GETBIT key offset
BITCOUNT key [start end]

127.0.0.1:6379> setbit sign 0 0
(integer) 0
127.0.0.1:6379> setbit sign 1 1
(integer) 0
127.0.0.1:6379> setbit sign 2 1
(integer) 0
127.0.0.1:6379> setbit sign 3 0
(integer) 0
127.0.0.1:6379> setbit sign 4 0
(integer) 0
127.0.0.1:6379> SETBIT sign 5 1
(integer) 0
127.0.0.1:6379> SETBIT sign 6 1
(integer) 0
127.0.0.1:6379> GETBIT sign 3
(integer) 0
--------------------------------------------------------------------
127.0.0.1:6379> GETBIT sign 3
(integer) 0
--------------------------------------------------------------------
127.0.0.1:6379> BITCOUNT sign
(integer) 4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值