redis存储的数据格式

redis数据类型

数据类型:http://www.redis.cn/topics/data-types.html
redis命令:http://www.redis.cn/commands.html#geo

字符串(string)

   字符串是所有编程语言中最常见的和最常用的数据类型,而且也是redis最基本的数据类型之一,而且redis中所有的key的类型都是字符串。

   String是简单的key-value键值对,value不仅可以是String,也可以是数字。String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr,decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。

   String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr,decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。

字符串的相关命令
SET key value                   ##设置key=value
GET key                         ##或者键key对应的值
GETRANGE key start end          ##得到字符串的子字符串存放在一个键
GETSET key value                ##设置键的字符串值,并返回旧值
GETBIT key offset               ##返回存储在键位值的字符串值的偏移
MGET key1 [key2..]              ##得到所有的给定键的值
SETBIT key offset value         ##设置或清除该位在存储在键的字符串值偏移
SETEX key seconds value         ##键到期时设置值
SETNX key value                 ##设置键的值,只有当该键不存在
SETRANGE key offset value       ##覆盖字符串的一部分从指定键的偏移
STRLEN key                      ##得到存储在键的值的长度
MSET key value [key value...]   ##设置多个键和多个值
MSETNX key value [key value...] ##设置多个键多个值,只有在当没有按键的存在时
PSETEX key milliseconds value   ##设置键的毫秒值和到期时间
INCR key                        ##增加键的整数值一次
INCRBY key increment            ##由给定的数量递增键的整数值
INCRBYFLOAT key increment       ##由给定的数量递增键的浮点值
DECR key                        ##递减键一次的整数值
DECRBY key decrement            ##由给定数目递减键的整数值
APPEND key value                ##追加值到一个键

其中用于操作管理键的命令有:

DEL key                                 ##如果存在删除键
DUMP key                                ##返回存储在指定键的值的序列化版本
EXISTS key                              ##此命令检查该键是否存在
EXPIRE key seconds                      ##指定键的过期时间
EXPIREAT key timestamp                  ##指定的键过期时间。在这里,时间是在Unix时间戳格式
PEXPIRE key milliseconds                ##设置键以毫秒为单位到期
PEXPIREAT key milliseconds-timestamp    ##设置键在Unix时间戳指定为毫秒到期
KEYS pattern                            ##查找与指定模式匹配的所有键
MOVE key db                             ##移动键到另一个数据库
PERSIST key                             ##移除过期的键
PTTL key                                ##以毫秒为单位获取剩余时间的到期键。
TTL key                                 ##获取键到期的剩余时间。
RANDOMKEY                               ##从Redis返回随机键
RENAME key newkey                       ##更改键的名称
RENAMENX key newkey                     ##重命名键,如果新的键不存在
TYPE key                                ##返回存储在键的数据类型的值。
字符串示例

(1)创建查询删除一个key

  • set key
  • get key
  • del key

(2)批量创建多个key

  • MSET key1 value1 key2 value2 …
> MSET name1 jack name2 rose name3 alice name4 bob

(3)批量查询多个key

  • MGET key1 key2…
> MGET name1 name2 name3 name4 
1) "jack"
2) "rose"
3) "alice"
4) "bob"

(4)在已有的key追加字符串

  • APPEND key
  • 重新使用set是对key重新赋值(相当于先删后再创建)
> set testkey 'i am'
OK
> APPEND testkey ' fine'
(integer) 9
> get testkey
"i am fine"

> set key2 i am
(error) ERR syntax error  #value值如果有空格,引号引起来

(5)数值递增

  • INCR key
> set num 1024
OK
> INCR num
(integer) 1025
> INCR num
(integer) 1026
> get num
"1026"

(6)数值递减

  • DECR key

(7)返回字符串长度

  • STRLEN key
> STRLEN testkey
(integer) 9
> GET testkey
"i am fine"

(8)判断key是否存在

  • EXISTS key
> EXISTS time1
(integer) 0     #key不存在
> EXISTS time2
(integer) 1     #key存在

(9)查看key的过期时间

  • ttl key #查看key的剩余生存时间
    -1 #负一为永不过期,默认创建的key是永不过期,重新对key赋值,也会从有剩余生命周期变成永不过期
    -2 #为没有此key num #key的剩余有效期
> set name1 jack ex 50  (ex 指定key的有效期 此处指定的是50s  默认不指定是-1 永不过期)
> TTL name1
(integer) 42   
> PERSIST name1  将name1取消key的过期时间即设置为永不过期

(10)取消key的过期时间

  • PERSIST key
> PERSIST name1  将name1取消key的过期时间即设置为永不过期

List(列表)

   列表是一个双向可读写的管道,其头部是左侧尾部是右侧,一个列表最多可以包含2^32-1个元素即4294967295个元素。

   Redis列表是简单的字符串列表,可以类比到C++中的std::list,简单的说就是一个链表或者说是一个队列。可以从头部或尾部向Redis列表添加元素。

   Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。

列表的应用场景

   Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表、粉丝列表等都可以用Redis的list结构来实现,再比如有的应用使用Redis的list类型实现一个简单的轻量级消息队列

列表的相关命令
LPUSH key value [value ...]     ##从队列的左边入队一个或多个元素
RPUSH key value [value ...]     ##从队列的右边入队一个或多个元素
LLEN key                        ##获得队列的长度。若key不存在,则看作是空list,且返回长度为0。若存储在key里的值不是一个list的话,会返回error。
LRANGE key start stop           ##返回存储在key的列表里指定范围内的元素。start和end偏移量都是基于0的下标,即list的第一个元素下标是0(list的表头)。
LPOP key                        ##从队列左边出队一个元素
RPOP key                        ##从队列右边出队一个元素
LINDEX key index                ##获取一个元素,通过其索引列表
......
列表示例

(1)生成列表并入队元素

  • LPUSH|RPUSH key value [value …]
> LPUSH list1 jack alice
(integer) 2
> LPUSH list1 tom
(integer) 3

==>' 入队 '元素.

(2)获取列表长度

  • LLEN key
> LLEN list1
(integer) 3

(3)获取列表指定位置数据

  • LRANGE key start stop
> LRANGE list1 0 2
1) "tom"
2) "alice"
3) "jack"

(4)通过索引获取一个元素

> LINDEX list1 0
"tom"

集合(set)

   Set是String类型的无序集合,集合中的成员是唯一的,这就意味着集合中不能出现重复的数据,可以在两个不同的集合中对数据进行对比并取值。

   Redis的Sets类型是String的无序集合。增加,删除,测试元素是否存在的时间复杂度都是O(1)(不管集合中有多少元素都是稳定的时间消耗)

   Redis Sets的一个重要特性是不允许重复元素。向集合中添加多次相同的元素,集合中只存在一个该元素。在实际应用中,这意味着在添加一个元素前不需要先检查元素是否存在。

   Redis Sets支持多个服务器端命令来从现有集合开始计算集合,所以执行集合的交集,并集,差集都可以很快。set的最大长度是2^32–1(4294967295)个元素

集合的使用场景

   集合类型比较典型的使用场景:如一个用户对娱乐、体育比较感兴趣,另一个可能对新闻感兴趣,这些兴趣就是标签,有了这些数据就可以得到同一标签的人,以及用户的共同爱好的标签,这些数据对于用户体验以及曾强用户粘度比较重要。(用户和标签的关系维护应该放在一个事物内执行,防止部分命令失败造成数据不一致)。

sadd=tagging(标签)
spop/srandmember=random item(生成随机数,比如抽奖)
sadd+sinter=social Graph(社交需求)
集合的相关命令
SADD key member [member ...]        ##添加一个或者多个元素到集合(set)里
SMEMBERS key                        ##获取集合里面的所有元素
SDIFF key [key ...]                 ##获取队列不存在的元素(差集)
SINTER key [key ...]                ##获得两个集合的交集    
SUNION key [key ...]                ##添加多个set元素(并集)
...........
集合示例

(1)生成集合key

  • SADD key member …
  • SADD 也可以追加member,但是member是唯一的,不能重复
127.0.0.1:6379> SADD set1 value1 value2 value3
(integer) 3
127.0.0.1:6379> type set1
set

(2)查看集合的所有数据

  • SMEMBERS key
127.0.0.1:6379> SMEMBERS set1
1) "value3"
2) "value1"
3) "value2"
127.0.0.1:6379> SADD set2 value2 value4 value3
(integer) 3
127.0.0.1:6379> SMEMBERS set2
1) "value3"
2) "value2"
3) "value4"

(3)获取集合的差集

  • SDIFF A B
  • 差集:已属于A不属于B的元素称为A与B的差(集)
  • 注:此有先后顺序
127.0.0.1:6379> SDIFF set1 set2
1) "value1"
127.0.0.1:6379> SDIFF set2 set1
1) "value4"

(4)获取集合的交集

  • SINTER key [key …]
  • 交集:已属于A且属于B的元素称为A与B的交(集)
127.0.0.1:6379> SMEMBERS set1
1) "value3"
2) "value1"
3) "value2"
127.0.0.1:6379> SMEMBERS set2
1) "value3"
2) "value2"
3) "value4"
127.0.0.1:6379> SINTER set1 set2
1) "value3"
2) "value2"

(5)获取集合的并集

  • SUNION key [key …]
  • 并集:已属于A或属于B的元素为称为A与B的并(集)
127.0.0.1:6379> SUNION set1 set2
1) "value3"
2) "value1"
3) "value2"
4) "value4"
127.0.0.1:6379> SMEMBERS set1
1) "value3"
2) "value1"
3) "value2"
127.0.0.1:6379> SMEMBERS set2
1) "value3"
2) "value2"
3) "value4"

sorted set(有序集合)

   Redis有序集合类型与Redis的集合类型类似,是非重复的String元素的集合。不同之处在于,有序集合中的每个成员都关联一个Score,Score是在排序时候使用的,按照Score的值从小到大进行排序。集合中每个元素是唯一的,但Score有可能重复。

   使用有序集合可以很高效的进行,添加,移除,更新元素的操作(时间消耗与元素个数的对数成比例)。由于元素在集合中的位置是有序的,使用get ranges by score或者by rank(位置)来顺序获取或者随机读取效率都很高。

   Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个double(双精度浮点型)类型的分数,redis正是通过该分数来为集合中的成员进行从小到大的排序,有序集合的成员是唯一的,但分数(score)却可以重复,集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1), 集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)。

有序集合的使用场景

   排行榜:有序集合经典使用场景。例如视频网站需要对用户上传的视频做排行榜,榜单维护可能是多方面:按照时间、按照播放量、按照获得的赞数

有序集合的使用命令
ZADD key [NX|XX] [CH] [INCR] score member [score member ...]    ##添加到有序set的一个或多个成员,或更新的分数
ZRANGE key start stop [WITHSCORES]                              ##根据指定的index返回,返回sorted set的成员列表
ZCARD key                                                       ##获取一个排序集合中成员的数量
ZRANK key member                                                ##确定在排序集合成员的索引
.........
有序集合的示例

(1) 生成有序集合

  • ZADD key score member …
127.0.0.1:6379> ZADD zset1 1 value1 2 value2 3 value3
(integer) 3
127.0.0.1:6379> type zset1
zset

(2)显示集合内所有的key

  • ZRANGE key 0 -1
  • ZRANGE key start stop #根据指定的index返回,返回sorted set的成员列表
127.0.0.1:6379> ZRANGE zset1 0 -1
1) "value1"
2) "value2"
3) "value3"

(3)获取集合的长度数

  • ZCARD key #获取一个排序集合中成员的数量
127.0.0.1:6379> ZCARD zset1
(integer) 3

(4)返回某个数值的索引

  • ZRANK key member
127.0.0.1:6379> ZRANK zset1 value3
(integer) 2

哈希(hash)

   Redis Hashes 保存String域和String值之间的映射,所以它们是用来表示对象的绝佳数据类型(比如一个有着用户名,密码等属性的User对象)

   hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象,Redis 中每个 hash 可以存储2^32-1键值对。

哈希的使用场景

   哈希结构相对于字符串序列化缓存信息更加直观,并且在更新操作上更加便捷。所以常常用于用户信息等管理,但是哈希类型和关系型数据库有所不同,哈希类型是稀疏的,而关系型数据库是完全结构化的,关系型数据库可以做复杂的关系查询,而redis去模拟关系型复杂查询开发困难,维护成本高。

哈希相关命令
 HSET key field value           ##设置hash里面一个字段的值
 HGET key field                 ##获取hash至field的值
 HDEL key field [field ...]     ##删除一个或多个hash的field
 HGETALL key                    ##从hash中读取全部的域和值
...
哈希简单示例

(1)生成hash key

  • HSET key
127.0.0.1:6379> HSET hash1 name jack age 20
(integer) 2
127.0.0.1:6379> type hash1
hash

(2)获取hash key字段值

  • HGET key field
127.0.0.1:6379> HGET hash1 name
"jack"
127.0.0.1:6379> HGET hash1 age
"20"

(3)删除一个hash key的字段

  • HDEL key field
127.0.0.1:6379> HDEL hash1 age 
(integer) 1
127.0.0.1:6379> HGET hash1 age
(nil)

(4)获取所有hash表中的key

  • HGETALL key
127.0.0.1:6379> HSET hash2 name alice age 18 gender f
(integer) 3
127.0.0.1:6379> HGETALL hash2
1) "name"
2) "alice"
3) "age"
4) "18"
5) "gender"
6) "f"
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值