created at 2023/08/03 03:59:35
updated at 2023/08/03 12:05:31
Redis 是完全开源的,遵守 BSD 协议,是一个 NOSQL(not only sql)非关系型高性能的 key-value 数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
1.1.什么是NOSQL NoSQL(NoSQL = Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库。
随着互联网 web2.0 网站的兴起,传统的关系数据库在应付 web2.0 网站,特别是超大规模和高并发的 SNS 类型的 web2.0 纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL 数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。 1.1.1. NOSQL 和关系型数据库比较
优点: 1)成本:nosql 数据库简单易部署,基本都是开源软件,不需要像使用 oracle 那样花费大量成本购买使用,相比关系型数据库价格便宜。
2)查询速度:nosql 数据库将数据存储于缓存之中,关系型数据库将数据存储在硬盘中,自然查询速度远不及 nosql 数据库。
3)存储数据的格式:nosql 的存储格式是 key,value 形式、文档形式、图片形式等等,所以可以存储基础类型以及对象或者是集合等各种格式,而数据库则只支持基础类型。
4)扩展性:关系型数据库有类似 join 这样的多表查询机制的限制导致扩展很艰难。 缺点: 1)维护的工具和资料有限,因为 nosql 是属于新的技术,不能和关系型数据库 10 几年的技术同日而语。
2)不提供对sql的支持,如果不支持sql这样的工业标准,将产生一定用户的学习和使用成本。
3)不提供关系型数据库对事务的处理。 1.1.2. 非关系型数据库的优势:
1)性能 NOSQL 是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过 SQL 层的解析,所以性能非常高。
2)可扩展性同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。 1.1.3. 关系型数据库的优势:
1)复杂查询可以用 SQL 语句方便的在一个表以及多个表之间做非常复杂的数据查询。
2)事务支持使得对于安全性能很高的数据访问要求得以实现。对于这两类数据库,对方的优势就是自己的弱势,反之亦然。 1.1.4. 总结
关系型数据库与 NoSQL 数据库并非对立而是互补的关系,即通常情况下使用关系型数据库,在适合使用 NoSQL 的时候使用 NoSQL 数据库, 让 NoSQL 数据库对关系型数据库的不足进行弥补。 一般会将数据存储在关系型数据库中,在 nosql 数据库中备份存储关系型数据库的数据 1.2.主流的 NOSQL 产品
• 键值(Key-Value)存储数据库
相关产品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB 典型应用: 内容缓存,主要用于处理大量数据的高访问负载。 数据模型: 一系列键值对 优势: 快速查询 劣势: 存储的数据缺少结构化
• 列存储数据库
相关产品:Cassandra, HBase, Riak 典型应用:分布式的文件系统 数据模型:以列簇式存储,将同一列数据存在一起 优势:查找速度快,可扩展性强,更容易进行分布式扩展 劣势:功能相对局限
• 文档型数据库
相关产品:CouchDB、MongoDB 典型应用:Web应用(与Key-Value类似,Value是结构化的) 数据模型: 一系列键值对 优势:数据结构要求不严格 劣势: 查询性能不高,而且缺乏统一的查询语法
• 图形(Graph)数据库
相关数据库:Neo4J、InfoGrid、Infinite Graph 典型应用:社交网络 数据模型:图结构 优势:利用图结构相关算法。 劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。
• 缓存(数据查询、短连接、新闻内容、商品内容等等) • 聊天室的在线好友列表 • 任务队列。(秒杀、抢购、12306等等) • 应用排行榜 • 网站访问统计 • 数据过期处理(可以精确到毫秒 • 分布式集群架构中的session分离
各个数据类型应用场景:
类型 | 简介 | 特性 | 场景 |
---|---|---|---|
String(字符串) | 二进制安全 | 可以包含任何数据,比如 jpg 图片或者序列化的对象,一个键最大能存储 512M | --- |
Hash(字典) | 键值对集合,即编程语言中的 Map 类型 | 适合存储对象,并且可以像数据库中 update 一个属性一样只修改某一项属性值(Memcached 中需要取出整个字符串反序列化成对象修改完再序列化存回去) | 存储、读取、修改用户属性 |
List(列表) | 链表(双向链表) | 增删快,提供了操作某一段元素的 API | 1,最新消息排行等功能(比如朋友圈的时间线) 2,消息队列 |
Set(集合) | 哈希表实现,元素不重复 | 1、添加、删除,查找的复杂度都是 O(1) 2、为集合提供了求交集、并集、差集等操作 | 1、共同好友 2、利用唯一性,统计访问网站的所有独立 ip 3、好友推荐时,根据 tag 求交集,大于某个阈值就可以推荐 |
Sorted Set(有序集合) | 将 Set 中的元素增加一个权重参数 score,元素按 score 有序排列 | 数据插入集合时,已经进行天然排序 | 1、排行榜 2、带权重的消息队列 |
Redis 客户端的基本语法为:
shell
$ redis-cli
$ redis-cli -h host -p port -a password
有时候会有中文乱码。 要在 redis-cli 后面加上 --raw redis-cli --raw 就可以避免中文乱码了
shell
#字符串
set key value
get ket
del key
#哈希
hset key field value
hget key field
hgetall key #获取所有的键值
hdel key field
#列表
lpush key value #左添加
rpush key value #右添加
lrange key value #范围获取
lpop key #左删
rpop key #右删
#集合
sadd key value
smembers key #获取所有
srem key value #删除指定
#有序集合
zadd key score value
zrange key start end[0 -1] withscores
zren key value
shell
keys * #获取所有键 type key #获取键对应值的类型 del key #
redis 是一个内存数据库,当 redis 服务器重启,获取电脑重启,数据会丢失,我们可以将 redis 内存中的数据持久化保存到硬盘的文件中。
redis 持久化机制: 1. RDB:默认方式,不需要进行配置,默认就使用这种机制.在一定的间隔时间中,检测 key 的变化情况,然后持久化数据
ini
#after 900 sec (15 min) if at least 1 key changed
save 900 1
#after 300 sec (5 min) if at least 10 keys changed
save 300 10
#after 60 sec if at least 10000 keys changed
save 60 10000
ini
2. AOF:日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据
1. 编辑redis.windwos.conf文件
appendonly no(关闭aof) --> appendonly yes (开启aof)
# appendfsync always : 每一次操作都进行持久化
appendfsync everysec : 每隔一秒进行一次持久化
# appendfsync no : 不进行持久化