Redis

一、Nosql概述

如今信息量井喷式增长,各种各样的数据出现(用户定位数据,图片数据等),大数据的背景下关系型数据库(RDBMS)无法满足大量数据要求。Nosql数据库就能轻松解决这些问题。

目前一个基本的互联网项目

在这里插入图片描述

什么是Nosql

NoSQL = Not Only SQL(不仅仅是SQL)

关系型数据库:列+行,同一个表下数据的结构是一样的。

非关系型数据库:数据存储没有固定的格式,并且可以进行横向扩展。

特点

  • 方便扩展(数据之间没有关系,很好扩展!)

  • 大数据量高性能(Redis一秒可以写8万次,读11万次,NoSQL的缓存记录级,是一种细粒度的缓存,性能会比较高!)

  • 数据类型是多样型的!(不需要事先设计数据库,随取随用)

  • 传统的 RDBMS 和 NoSQL

传统的 RDBMS(关系型数据库)
- 结构化组织
- SQL
- 数据和关系都存在单独的表中 row col
- 操作,数据定义语言
- 严格的一致性
- 基础的事务
- ...

Nosql
- 不仅仅是数据
- 没有固定的查询语言
- 键值对存储,列存储,文档存储,图形数据库(社交关系)
- 最终一致性
- CAP定理和BASE
- 高性能,高可用,高扩展
- ...

了解:3V + 3高

大数据时代的3V :主要是描述问题的

海量Velume

多样Variety

实时Velocity

大数据时代的3高 : 主要是对程序的要求

高并发

高可扩

高性能

Nosql的四大分类

  1. KV键值对
  • 新浪:Redis
  • 美团:Redis + Tair
  • 阿里、百度:Redis + Memcache
  1. 文档型数据库(bson数据格式):
  • MongoDB(掌握)

    • 基于分布式文件存储的数据库。C++编写,用于处理大量文档。
      MongoDB是RDBMS和NoSQL的中间产品。
    • MongoDB是非关系型数据库中功能最丰富的,NoSQL中最像关系型数据库的数据库。
  1. 列存储数据库
  • HBase(大数据必学)
  • 分布式文件系统
  1. 图关系数据库

用于广告推荐,社交网络

Neo4j、InfoGrid

在这里插入图片描述

二、Redis入门

概述

Redis(Remote Dictionary Server ),即远程字典服务。

是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

能干什么

  • 内存存储、持久化,内存是断电即失的,所以需要持久化(RDB、AOF)
  • 高效率、用于高速缓冲
  • 发布订阅系统
  • 地图信息分析
  • 计时器、计数器(eg:浏览量)
  • 。。。

特性

  • 多样的数据类型

  • 持久化

  • 集群

  • 事务

基础知识

1. redis默认有16个数据库

默认使用的第0个;

16个数据库为:DB 0~DB 15
默认使用DB 0 ,可以使用select n切换到DB n,dbsize可以查看当前数据库的大小,与key数量相关。

2. 命令

select n

dbsize

keys * :查看当前数据库中所有的key。

flushdb:清空当前数据库中的键值对。

flushall:清空所有数据库的键值对。

3. Redis是单线程的,Redis是基于内存操作的。

所以Redis的性能瓶颈不是CPU,而是机器内存和网络带宽。

那么为什么Redis的速度如此快呢,性能这么高呢?QPS达到10W+

核心:Redis是将所有的数据放在内存中的,所以说使用单线程去操作效率就是最高的,多线程(CPU上下文会切换:耗时的操作!),对于内存系统来说,如果没有上下文切换效率就是最高的,多次读写都是在一个CPU上的,在内存存储数据情况下,单线程就是最佳的方案。

三、五大数据类型

​ Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。

Redis-key

在redis中无论什么数据类型,在数据库中都是以key-value形式保存,通过进行对Redis-key的操作,来完成对数据库中数据的操作。

  • exists key:判断键是否存在
  • del key:删除键值对
  • move key db:将键值对移动到指定数据库
  • expire key second:设置键值对的过期时间
  • type key:查看value的数据类型

String(字符串)

  • set
  • get
  • APPEND key value :向指定的key的value后追加字符串
  • DECR/INCR key :将指定key的value数值进行+1/-1(仅对于数字)
  • INCRBY/DECRBY key n:按指定的步长对数值进行加减
  • INCRBYFLOAT key n:为数值加上浮点型数值
  • STRLEN key:获取key保存值的字符串长度
  • GETRANGE key start end:按起止位置获取字符串(闭区间,起止位置都取)
  • SETRANGE key offset value: 用指定的value 替换key中 offset开始的值
  • GETSET key value : 将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
  • SETNX key value :仅当key不存在时进行set
  • SETEX key seconds value:set 键值对并设置过期时间
  • MSET key1 value1 [key2 value2…]:批量set键值对
  • MSETNX key1 value1 [key2 value2…]:批量设置键值对,仅当参数中所有的key都不存在时执行
  • MGET key1 [key2…]:批量获取多个key保存的值
  • PSETEX key milliseconds value:和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,
  • getset key value :如果不存在值,则返回nil,如果存在值,获取原来的值,并设置新的值

使用场景:value除了是字符串还可以是数字,用途举例:

  • 计数器
  • 统计多单位的数量:uid:123666:follow 0
  • 粉丝数
  • 对象存储缓存

List(列表)

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)

一个列表最多可以包含 2^32 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。

首先我们列表,可以经过规则定义将其变为队列、栈、双端队列等
在这里插入图片描述

正如图Redis中List是可以进行双端操作的,所以命令也就分为了LXXX和RLLL两类,有时候L也表示List例如LLEN

  • LPUSH/RPUSH key value1[value2…]:从左边/右边向列表中PUSH值(一个或者多个)。
  • LRANGE key start end:获取list 起止元素==(索引从左往右 递增)==
  • LPUSHX/RPUSHX key value:向已存在的列名中push值(一个或者多个)
  • LINSERT key BEFORE|AFTER pivot value:在指定列表元素的前/后 插入value
  • LLEN key:查看列表长度
  • LINDEX key index :通过索引获取列表元素
  • LSET key index value:通过索引为元素设值
  • LPOP/RPOP key :从最左边/最右边移除值 并返回
  • RPOPLPUSH source destination :将列表的尾部(右)最后一个值弹出,并返回,然后加到另一个列表的头部
  • LTRIM key start end :通过下标截取指定范围内的列表
  • LREM key count value :List中是允许value重复的 count > 0:从头部开始搜索 然后删除指定的value 至多删除count个 count < 0:从尾部开始搜索… count = 0:删除列表中所有的指定value。

在两边插入或者改动值,效率最高!修改中间元素,效率相对较低

使用场景:

消息排队!消息队列(Lpush Rpop),栈(Lpush Lpop)

Set(集合)

Redis的Set是string类型的无序不重复集合

Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

  • SADD key member1[member2…]:向集合中无序增加一个/多个成员
  • SCARD key:获取集合的成员数
  • SMEMBERS key:返回集合中所有的成员
  • SISMEMBER key member:查询member元素是否是集合的成员,结果是无序的
  • SRANDMEMBER key [count] :随机返回集合中count个成员,count缺省值为1
  • SPOP key [count]:随机移除并返回集合中count个成员,count缺省值为1
  • SMOVE source destination member:将source集合的成员member移动到destination集合
  • SREM key member1[member2…]:移除集合中一个/多个成员
  • SDIFF key1[key2…]:返回所有集合的差集 key1- key2 -
  • SDIFFSTORE destination key1[key2…]:在SDIFF的基础上,将结果保存到集合中==(覆盖)==。不能保存到其他类型key噢
  • SINTER key1 [key2…]:返回所有集合的交集
  • SINTERSTORE destination key1[key2…]:在SINTER的基础上,存储结果到集合中。覆盖
  • SUNION key1 [key2…]:返回所有集合的并集
  • SUNIONSTORE destination key1 [key2…]:在SUNION的基础上,存储结果到及和张。覆盖
  • SSCAN KEY [MATCH pattern] [COUNT count]:在大量数据环境下,使用此命令遍历集合中元素,每次遍历部分

Hash(哈希)

Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象

Set就是一种简化的Hash,只变动key,而value使用默认值填充。可以将一个Hash表作为一个对象进行存储,表中存放对象的信息。

在这里插入图片描述

使用场景:
用户信息之类的,经常变动的信息!
Hash更适合于对象的存储,Sring更加适合字符串存储!

Zset(有序集合)

不同的是每个元素都会关联一个double类型的分数(score)。redis正是通过分数来为集合中的成员进行从小到大的排序

score相同:按字典顺序排序

有序集合的成员是唯一的,但分数(score)却可以重复。

在这里插入图片描述
在这里插入图片描述

使用场景:

  • set排序 存储班级成绩表 工资表排序!
  • 普通消息,1.重要消息 2.带权重进行判断
  • 排行榜应用实现,取Top N测试

四、三种特殊数据类型

Geospatial(地理位置)

使用经纬度定位地理坐标并用一个有序集合zset保存,所以zset命令也可以使用

在这里插入图片描述

有效经纬度
有效的经度从-180度到180度。
有效的纬度从-85.05112878度到85.05112878度。

指定单位的参数 unit 必须是以下单位的其中一个:

  • m 表示单位为米。

  • km 表示单位为千米。

  • mi 表示单位为英里。

  • ft 表示单位为英尺。

关于GEORADIUS的参数
通过georadius就可以完成 附近的人功能

withcoord:带上坐标

withdist:带上距离,单位与半径单位相同

COUNT n : 只显示前n个(按距离递增排序)

Hyperloglog(基数统计)

Redis HyperLogLog 是用来做基数统计的算法

HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。

花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。

因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

其底层使用string数据类型

基数:数据集中不重复的元素的个数。

应用场景:
网页的访问量(UV):一个用户多次访问,也只能算作一个人。

传统实现,存储用户的id,然后每次进行比较。当用户变多之后这种方式及其浪费空间,而我们的目的只是计数
Hyperloglog就能帮助我们利用最小的空间完成。

在这里插入图片描述
如果允许容错,那么一定可以使用Hyperloglog !

如果不允许容错,就使用set或者自己的数据类型即可 !

BitMaps(位图)

使用位存储,信息状态只有 0 和 1

Bitmap是一串连续的2进制数字(0或1),每一位所在的位置为偏移(offset),在bitmap上可执行AND,OR,XOR,NOT以及其它位操作。

应用场景

签到统计、状态统计

在这里插入图片描述

五、事务

Redis的单条命令是保证原子性的,但是redis事务不能保证原子性

Redis事务没有隔离级别的概念

Redis事务操作过程

  • 开启事务(multi)
  • 命令入队
  • 执行事务(exec)
  • DISCARD # 放弃事务
127.0.0.1:6379> multi # 开启事务
OK
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值