rediszset转set反序列化失败_Redis基础知识⼤补
Redis
是开源,内存中的数据结构存储系统,它可以⽤作数据库、缓存和消息中间件。它⽀持多种类型的数据结构,如字符串 strings,散列hashes,列表 lists,集合 sets,有序集合 sorted sets 与范围查询, bitmaps,hyperloglogs 和 地理空间(geospatial)索引半径查询。
Redis 还内置了复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions)和不同级别的磁盘持久化(persistence),并通过 Redis 哨兵(Sentinel)和⾃动分区(Cluster)提供⾼可⽤性(high availability)。
缓存 + 拆分
随着访问量的上升,⼀个数据库已经不能满⾜我们的需求了。为了更⾼的性能,我们在中间加上了⼀个缓存层并且将数据库做了集、结构优化和读写分离。
缓存 拆分 分解图
这⾥的缓存就是 NoSQL,当然做缓存也只是 NoSQL 的⼀种功能,就像 Redis 并不仅仅有缓存这⼀种功能。⽐如它还能实现 简单的消息队列,解决Session共享,计数器,排⾏榜,好友关系处理 等等功能。
Redis 通⽤命令
keys
172.0.0.1:6379> set test1 hello
127.0.0.1:6379> set test2 world
127.0.0.1:6379> keys *test*
1) "test2"
2) "test1"
dbsize计算key的总数,这是redis内置的⼀个计算器,时间复杂度为O(1)。
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 k4 v4
OK
127.0.0.1:6379> dbsize
(integer) 4
127.0.0.1:6379> sadd myset a b c d e f g
(integer) 7
127.0.0.1:6379> dbsize
(integer) 5
exists检查key是否存在,存在返回1,不存在返回0
127.0.0.1:6379> set a b
OK
127.0.0.1:6379> exists a
(integer) 1
127.0.0.1:6379> del a
(integer) 1
127.0.0.1:6379> exists a
(integer) 0
del删除指定key-value,可以同时删除多个,删除成功返回删除的key个数,如果不存在返回0,时间复杂度为O(1)。127.0.0.1:6379> mset a b test1 hello test2 world
OK
127.0.0.1:6379> del a test1 test2
(integer) 3
127.0.0.1:6379> del a test1 test2
(integer) 0
expireexpire key seconds 设置key在seconds秒后过期,时间复杂度为O(1)。
127.0.0.1:6379> set test1 hello
OK
127.0.0.1:6379> expire test1 20
(integer) 1
ttlttl key 查看key剩余的过期时间,时间复杂度为O(1)。
127.0.0.1:6379> ttl test1
(integer) 13
127.0.0.1:6379> ttl test1
(integer) 8
127.0.0.1:6379> ttl test1
(integer) -2
# -2代表key已经不存在了
# 过期后再去查看key值,发现已经不存在了
127.0.0.1:6379> get test1
(nil)
persistpersist key 去掉key的过期时间,时间复杂度为O(1)。
127.0.0.1:6379> set test1 hello
OK
127.0.0.1:6379> expire test1 60
(integer) 1
127.0.0.1:6379> ttl test1
(integer) 56
# 去掉过期时间
127.0.0.1:6379> persist test1
(integer) 1
127.0.0.1:6379> ttl test1
(integer) -1
# -1代表key存在,但是没有过期时间
# 去掉过期时间后即便过期了也没有被删除
127.0.0.1:6379> get test1
"hello"
typetype key 返回key的类型,redis有5种数据结构,所以返回值有string、hash、list、set、zset,如果key不存在的,则返回none,时间复杂度为O(1)。
127.0.0.1:6379> type myset
none
127.0.0.1:6379> sadd myset a b c d e
(integer) 5
127.0.0.1:6379> type myset
set
Redis 的五种基本数据类型
Redis 作为缓存能实现的其他功能,⽐如计数器,排⾏榜,好友关系等,这些实现的依据就是靠着 Redis 的数据结构。在整个 Redis 中⼀共有五种基本的数据结构,他们分别是 字符串strings,散列 hashes,列表 lists,集合 sets,有序集合 sorted sets。
String(字符串)
string 是 redis 最基本的类型,你可以理解成与 Memcached ⼀模⼀样的类型,⼀个 key 对应⼀个 value。
string 类型是⼆进制安全的。意思是 redis 的 string 可以包含任何数据。⽐如jpg图⽚或者序列化的对象。
string 类型是 Redis 最基本的数据类型,string 类型的值最⼤能存储 512MB。
常⽤命令:set、get、decr、incr、mget等。
redis支持的五种数据类型
注意:⼀个键最⼤能存储512MB。
Hash(哈希)
Redis hash 是⼀个键值(key=>value)对集合;是⼀个 string 类型的 field 和 value 的映射表,hash 特别适合⽤于存储对象。
每个 hash 可以存储 232 -1 键值对(40多亿)。
常⽤命令:hget、hset、hgetall等。
应⽤场景:存储⼀些结构化的数据,⽐如⽤户的昵称、年龄、性别、积分等,存储⼀个⽤户信息对象数据。
List(列表)
Redis 列表是简单的字符串列表,按照插⼊顺序排序。你可以添加⼀个元素到列表的头部(左边)或者尾部(右边)。
list类型经常会被⽤于消息队列的服务,以完成多程序之间的消息交换。
常⽤命令:lpush、rpush、lpop、rpop、lrange等。
列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。
Set(集合)
Redis的Set是string类型的⽆序集合。和列表⼀样,在执⾏插⼊和删除和判断是否存在某元素时,效率是很⾼的。集合最⼤的优势在于可以进⾏交集并集差集操作。Set可包含的最⼤元素数量是4294967295。集合是通过哈希表实现的,所以添加,删除,查的复杂度都是
O(1)。
应⽤场景:
1、利⽤交集求共同好友。
2、利⽤唯⼀性,可以统计访问⽹站的所有独⽴IP。
3、好友推荐的时候根据tag求交集,⼤于某个threshold(临界值的)就可以推荐。
常⽤命令:sadd、spop、smembers、sunion等。
集合中最⼤的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。
zset(sorted set:有序集合)
Redis zset 和 set ⼀样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联⼀个double类型的分数。redis正是通过分数来为集合中的成员进⾏从⼩到⼤的排序。
zset的成员是唯⼀的,但分数(score)却可以重复。
sorted set是插⼊有序的,即⾃动排序。
常⽤命令:zadd、zrange、zrem、zcard等。
当你需要⼀个有序的并且不重复的集合列表时,那么可以选择sorted set数据结构。
应⽤举例:
(1)例如存储全班同学的成绩,其集合value可以是同学的学号,⽽score就可以是成绩。
(2)排⾏榜应⽤,根据得分列出topN的⽤户等。
redis存储⽂件格式
使⽤了两种⽂件格式:全量数据和增量请求。
全量数据格式是把内存中的数据写⼊磁盘,便于下次读取⽂件进⾏加载;
增量请求⽂件则是把内存中的数据序列化为操作请求,⽤于读取⽂件进⾏replay得到数据,序列化的操作包括SET、RPUSH、SADD、ZADD。
redis的存储分为内存存储、磁盘存储和log⽂件三部分,配置⽂件中有三个参数对其进⾏配置。
save seconds updates,save配置,指出在多长时间内,有多少次更新操作,就将数据同步到数据⽂件。这个可以多个条件配合,⽐如默认配置⽂件中的设置,就设置了三个条件。
appendonly yes/no ,appendonly配置,指出是否在每次更新操作后进⾏⽇志记录,如果不开启,可能会在断电时导致⼀段时间内的数据丢失。因为redis本⾝同步数据⽂件是按上⾯的save条件来同步的,所以有的数据会在⼀段时间内只存在于内存中。
appendfsync no/always/everysec ,appendfsync配置,no表⽰等操作系统进⾏数据缓存同步到磁盘,always表⽰每次更新操作后⼿动调⽤fsync()将数据写到磁盘,everysec表⽰每秒同步⼀次。
Redis分布式锁
分布式锁在很多场景中是⾮常有⽤的原语, 不同的进程必须以独占资源的⽅式实现资源共享就是⼀个典型的例⼦。
有很多分布式锁的库和描述怎么实现分布式锁管理器(DLM)的博客,但是每个库的实现⽅式都不太⼀样,很多库的实现⽅式为了简单降低了可靠性,⽽有的使⽤了稍微复杂的设计。
这个页⾯试图提供⼀个使⽤Redis实现分布式锁的规范算法。我们提出⼀种算法,叫Redlock,我们认为这种实现⽐普通的单实例实现更安全,请关注redis社区。
获取锁的时候,使⽤set加锁,使⽤expire命令为锁添加⼀个超时时间,锁的value值为⼀个随机⽣成的uuid。
获取锁的时候还设置⼀个获取超时的时间,若超过时间则放弃获取锁。
释放锁判断是否是此uuid 如果是则删除,释放锁。
优点:很多缓存服务都是集部署避免单点问题,提供了很多实现分布式锁的⽅法。性能好实现起来⽅便。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。