西安做网站的哪家好,如何做影视网站,户县建设局网站,chinacd.wordpress1. Redis 入门
1.1. Redis 诞生历程
1.1.1.从一个故事开始
08 年的时候有一个意大利西西里岛的小伙子#xff0c;笔名 antirez#xff08;http://invece.org/#xff09;#xff0c;创建了一个访客信息网站 LLOOGG.COM。有的时候我们需要知道网站的访问情况#xff0c;…1. Redis 入门
1.1. Redis 诞生历程
1.1.1.从一个故事开始
08 年的时候有一个意大利西西里岛的小伙子笔名 antirezhttp://invece.org/创建了一个访客信息网站 LLOOGG.COM。有的时候我们需要知道网站的访问情况比如访客的 IP、操作系统、浏览器、使用的搜索关键词、所在地区、访问的网页地址等等。在国内有很多网站提供了这个功能比如 CNZZ百度统计国外也有谷歌的 GoogleAnalytics。我们不用自己写代码去实现这个功能只需要在全局的 footer 里面嵌入一段JS 代码就行了当页面被访问的时候就会自动把访客的信息发送到这些网站统计的服务器然后我们登录后台就可以查看数据了。
LLOOGG.COM 提供的就是这种功能它可以查看最多 10000 条的最新浏览记录。这样的话它需要为每一个网站创建一个列表List不同网站的访问记录进入到不同的列表。如果列表的长度超过了用户指定的长度它需要把最早的记录删除先进先出。当 LLOOGG.COM 的用户越来越多的时候它需要维护的列表数量也越来越多这种记录最新的请求和删除最早的请求的操作也越来越多。LLOOGG.COM 最初使用的数据库是 MySQL可想而知因为每一次记录和删除都要读写磁盘因为数据量和并发量太大在这种情况下无论怎么去优化数据库都不管用了。
考虑到最终限制数据库性能的瓶颈在于磁盘所以 antirez 打算放弃磁盘自己去实现一个具有列表结构的数据库的原型把数据放在内存而不是磁盘这样可以大大地提升列表的 push 和 pop 的效率。antirez 发现这种思路确实能解决这个问题所以用 C 语言重写了这个内存数据库并且加上了持久化的功能09 年Redis 横空出世了。从最开始只支持列表的数据库到现在支持多种数据类型并且提供了一系列的高级特性Redis 已经成为一个在全世界被广泛使用的开源项目。
为什么叫 REDIS 呢它的全称是 REmote DIctionary Service直接翻译过来是远程字典服务。
从 Redis 的诞生历史我们看到了在某些场景中关系型数据库并不适合用来存储我们的 Web 应用的数据。那么关系型数据库和非关系型数据库或者说 SQL 和 NoSQL到底有什么不一样呢1.2. Redis 定位与特性
1.2.1.SQL 与 NoSQL
在绝大部分时候我们都会首先考虑用关系型数据库来存储我们的数据比如SQLServerOracleMySQL 等等。
关系型数据库的特点
1、它以表格的形式基于行存储数据是一个二维的模式。
2、它存储的是结构化的数据数据存储有固定的模式schema数据需要适应表结构。
3、表与表之间存在关联Relationship。
4、大部分关系型数据库都支持 SQL结构化查询语言的操作支持复杂的关联查询。
5、通过支持事务ACID 酸来提供严格或者实时的数据一致性。
但是使用关系型数据库也存在一些限制比如
1、要实现扩容的话只能向上垂直扩展比如磁盘限制了数据的存储就要扩大磁盘容量通过堆硬件的方式不支持动态的扩缩容。水平扩容需要复杂的技术来实现比如分库分表。
2、表结构修改困难因此存储的数据格式也受到限制。
3、在高并发和高数据量的情况下我们的关系型数据库通常会把数据持久化到磁盘基于磁盘的读写压力比较大。
为了规避关系型数据库的一系列问题我们就有了非关系型的数据库我们一般把它叫做“non-relational”或者“Not Only SQL”。NoSQL 最开始是不提供 SQL 的数据库的意思但是后来意思慢慢地发生了变化。
非关系型数据库的特点
1、存储非结构化的数据比如文本、图片、音频、视频。
2、表与表之间没有关联可扩展性强。
3、保证数据的最终一致性。遵循 BASE碱理论。 Basically Available基本可用 Soft-state软状态 Eventually Consistent最终一致性。
4、支持海量数据的存储和高并发的高效读写。
5、支持分布式能够对数据进行分片存储扩缩容简单。
对于不同的存储类型我们又有各种各样的非关系型数据库比如有几种常见的类型
1、KV 存储用 Key Value 的形式来存储数据。比较常见的有 Redis 和 MemcacheDB。
2、文档存储MongoDB。
3、列存储HBase。
4、图存储这个图Graph是数据结构不是文件格式。Neo4j。
5、对象存储。
6、XML 存储等等等等。1.2.2.Redis 特性
官网介绍https://redis.io/topics/introduction
中文网站http://www.redis.cn
硬件层面有 CPU 的缓存浏览器也有缓存手机的应用也有缓存。我们把数据缓存起来的原因就是从原始位置取数据的代价太大了放在一个临时位置存储起来取回就可以快一些。
Redis 的特性
1更丰富的数据类型
2进程内与跨进程单机与分布式
3功能丰富持久化机制、过期策略
4支持多种编程语言
5高可用集群1.3. Redis 启动
1.3.1.服务启动
src 目录下直接启动./redis-server后台启动指定配置文件
1、redis.conf 修改两行配置daemonize yes
bind 0.0.0.02、启动 Redisredis-server /usr/local/soft/redis-5.0.5/redis.conf总结redis 的参数可以通过三种方式配置一种是 redis.conf一种是启动时--携带的参数一种是 config set。1.3.2.基本操作
默认有 16 个库0-15可以在配置文件中修改默认使用第一个 db0。databases 1因为没有完全隔离不像数据库的 database不适合把不同的库分配给不同的业务使用。
切换数据库select ()清空当前数据库flushdb清空所有数据库
flushallRedis 是字典结构的存储方式采用 key-value 存储。key 和 value 的最大长度限制是 512M来自官网 https://redis.io/topics/data-types-intro/。
键的基本操作。
命令参考http://redisdoc.com/index.html
存值set qingshan 2673取值get qingshan
查看所有键keys *获取键总数dbsize查看键是否存在exists qingshan删除键del qingshan jack重命名键rename qingshan pengyuyan查看类型type qingshanRedis 一共有几种数据类型注意是数据类型不是数据结构
官网https://redis.io/topics/data-types-intro
String、Hash、Set、List、Zset、Hyperloglog、Geo、Streams1.4. Redis 基本数据类型
最基本也是最常用的数据类型就是 String。set 和 get 命令就是 String 的操作命令。为什么叫 Binary-safe strings 呢1.4.1.String 字符串
存储类型
可以用来存储字符串、整数、浮点数。
操作命令
设置多个值批量操作原子性mset qingshan 2673 jack 66设置值如果 key 存在则不成功setnx qingshan基于此可实现分布式锁。用 del key 释放锁。
但如果释放锁的操作失败了导致其他节点永远获取不到锁怎么办
加过期时间。单独用 expire 加过期也失败了无法保证原子性怎么办多参数set key value [expiration EX seconds|PX milliseconds][NX|XX]使用参数的方式set lock1 1 EX 10 NX整数值递增incr qingshan
incrby qingshan 100整数值递减decr qingshan
decrby qingshan 100浮点数增量set f 2.6
incrbyfloat f 7.3获取多个值mget qingshan jack获取值长度strlen qingshan字符串追加内容append qingshan good获取指定范围的字符getrange qingshan 0 8存储实现原理
数据模型
set hello word 为例因为 Redis 是 KV 的数据库它是通过 hashtable 实现的我们把这个叫做外层的哈希。所以每个键值对都会有一个 dictEntry源码位置dict.h里面指向了 key 和 和 value 的指针。next 指向下一个 dictEntry。typedef struct dictEntry {void *key; /* key 关键字定义 */union {void *val; uint64_t u64; /* value 定义 */int64_t s64; double d;} v;struct dictEntry *next; /* 指向下一个键值对节点 */
} dictEntrykey 是字符串但是 Redis 没有直接使用 C 的字符数组而是存储在自定义的 SDS中。 value 既不是直接作为字符串存储也不是直接存储在 SDS 中而是存储在redisObject 中。实际上五种常用的数据类型的任何一种都是通过 redisObject 来存储的。 redisObject redisObject 定义在 src/server.h 文件中。
typedef struct redisObject {unsigned type:4; /* 对象的类型包括OBJ_STRING、OBJ_LIST、OBJ_HASH、OBJ_SET、OBJ_ZSET */unsigned encoding:4; /* 具体的数据结构 */unsigned lru:LRU_BITS; /* 24 位对象最后一次被命令程序访问的时间与内存回收有关 */int refcount; /* 引用计数。当 refcount 为 0 的时候表示该对象已经不被任何对象引用则可以进行垃圾回收了*/void *ptr; /* 指向对象实际的数据结构 */
} robj;可以使用 type 命令来查看对外的类型。
127.0.0.1:6379 type qs
string127.0.0.1:6379 set number 1 OK 127.0.0.1:6379 set qs is a good teacher in gupao, have crossed mountains and sea OK 127.0.0.1:6379 set jack bighead OK 127.0.0.1:6379 object encoding number “int” 127.0.0.1:6379 object encoding jack “embstr” 127.0.0.1:6379 object encoding qs raw 字符串类型的内部编码有三种 1、int存储 8 个字节的长整型long2^63-1。 2、embstr, 代表 embstr 格式的 SDSSimple Dynamic String 简单动态字符串存储小于 44 个字节的字符串。 3、raw存储大于 44 个字节的字符串3.2 版本之前是 39 字节。为什么是 39
/* object.c */
#define OBJ_ENCODING_EMBSTR_SIZE_LIMIT 4