Redis学习
NoSql
1.1 什么是Nosql
NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是 超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的 数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合,多重数据 种类带来的挑战,尤其是大数据应用难题。 NoSQL最常见的解释是“non-relational”, “Not Only SQL”也被很多人接受。NoSQL仅仅是一个概念,泛指非关系 型的数据库,区别于关系数据库,它们不保证关系数据的ACID特性。
1.2 为什么要使用NoSql
传统的数据库遇到的瓶颈 传统的关系数据库具有不错的性能,高稳定型,久经历史考验,而且使用简单,功能强大,同时也积累 了大量的 成功案例。在互联网领域,MySQL成为了绝对靠前的王者,毫不夸张的说,MySQL为互联网 的发展做出了卓越的 贡献。
在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付。在那个时候,更多的都是 静态 网页,动态交互类型的网站不多。 到了最近10年,网站开始快速发展。火爆的论坛、博客、sns、微博逐渐引领web领域的潮流。在初 期,论坛的流 量其实也不大,如果你接触网络比较早,你可能还记得那个时候还有文本型存储的论坛程 序,可以想象一般的论坛 的流量有多大。
现在网站的特点:
(1) 高并发读写 Web2.0网站,数据库并发负载非常高,往往达到每秒上万次的读写请求
(2) 高容量存储和高效存储 Web2.0网站通常需要在后台数据库中存储海量数据,如何存储海量数据并进行高效的查询往往是一个 挑战
(3) 高扩展性和高可用性 随着系统的用户量和访问量与日俱增,需要数据库能够很方便的进行扩展、维护
1.3 NoSql数据库的优势
(1) 易扩展
NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这 样就 非常容易扩展。也无形之间,在架构的层面上带来了可扩展的能力。
(2)大数据量,高性能 NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性, 数据 库的结构简单。一般MySQL使用Query Cache,每次表的更新Cache就失效,是一种大粒度的 Cache,在针对 web2.0的交互频繁的应用,Cache性能不高。而NoSQL的Cache是记录级的,是一种细 粒度的Cache,所以 NoSQL在这个层面上来说就要性能高很多了。
(3)灵活的数据模型 NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删 字段 是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。这点在大数据量 的web2.0时代 尤其明显。
(4) 高可用 NoSQL在不太影响性能的情况,就可以方便的实现高可用的架构。比如Cassandra,HBase模型,通过 复制 模型也能实现高可用。
1.4 常见的NoSql产品

1.5 各产品的区别

Redis介绍
2.1 什么是Redis
全称:REmote DIctionary Server(远程字典服务器)。是完全开源免费的,用C语言编写的, 遵守BCD协议。是 一个高性能的(key/value)分布式内存数据库, 基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务器。
Redis 与其他 key - value 缓存产品有以下三个特点
(1) Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用
(2) Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储
(3) Redis支持数据的备份,即master-slave(主从)模式的数据备份
**2.2 Redis优势 **
(1) 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
(2) 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
(3) 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
(4) 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性
(5) 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不 用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
(6) 使用多路I/O复用模型,非阻塞IO;
2.3 Redis应用场景
(1) 缓存(数据查询,短连接,新闻内容,商品内容等),使用最多
(2) 聊天室在线好友列表
(3) 任务队列(秒杀,抢购,12306等)
(4) 应用排行榜
(5) 网站访问统计
(6) 数据过期处理(可以精确到毫秒)
(7) 分布式集群架构中的session问题
Linux下安装Redis
3.1 环境准备
(1)虚拟机版本:VMware® Workstation 12 Pro
(2) Linux系统:Centos Release 6.5
(3) 远程命令端:xshell
(4)文件传输工具:SecureFXPortable
3.2 Redis的安装
3.2.1 Redis的编译环境
Redis是C语言开发的,安装redis需要先去官网下载源码进行编译,编译需要依赖于GCC编译环境,如果CentOS上 没有安装gcc编译环境,需要提前安装,安装命令如下:(这里我们使用root用户处理这些操作)
[root@localhost ~]# yum install gcc-c++
如果提示是否下载,选择: y

如果提示是否安装,选择: y

3.2.2 Redis的安装
Redis数据结构
命令学习网站:http://doc.redisfans.com/index.html
Redis是一种基于内存的数据库,并且提供一定的持久化功能,它是一种键值(key-value)数据库,使用 key 作为 索引找到当前缓存的数据,并且返回给程序调用者。
当前的 Redis 支持 6 种数据类型,它们分别是:
字符串(String)、列表(List)、集合(set)、哈希结构 (hash)、有序集合(zset)和基数(HyperLogLog)
String(字符串)
赋值语法:SET key value
127.0.0.1:6379> set name "coder"
OK
取值语法: GET key
127.0.0.1:6379> get name
"coder"
设置多个键语法: MSET key value [key value …]
127.0.0.1:6379> mset age 20 gender "male"
OK
获取多个键值语法: MGET key [key …]
127.0.0.1:6379> mget name age gender
1) "coder"
2) "20"
3) "male"
删除语法:DEL key
127.0.0.1:6379> del gender
(integer) 1
127.0.0.1:6379> get gender
(nil)
字符串数字的递增与递减
递增数字:当存储的字符串是整数时,Redis提供了一个实用的命令INCR,其作用是让当前键值递增,并返回递增 后的值。 递增数字语法: INCR key 递减数值语法: DECR key 增加指定的整数语法: INCRBY key increment 减少指定的整数 语法:DECRBY key decrement
递增
127.0.0.1:6379> incr num
(integer) 1
127.0.0.1:6379> incr num
(integer) 2
递减
127.0.0.1:6379> decr num
(integer) 1
127.0.0.1:6379> decr num
(integer) 0
指定步长:(了解)
127.0.0.1:6379> incrby num 2
(integer) 2
127.0.0.1:6379> decrby num 2
(integer) 0
Hash散列(了解)
hash叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其它类 型。相当于是对象格式的存储
赋值语法: HSET key field value
设置一个字段值, HSET命令不区分插入和更新操作,当执行插入操作时HSET命令返回1,当执行更新操作时 返回0.
127.0.0.1:6379> hset user name wl
(integer) 1
取值语法: HGET key field
127.0.0.1:6379> hget user name
"wl"
设置多个字段语法: HMSET key field value [field value ...]
127.0.0.1:6379> hmset user age 20 gender male
OK
取多个值语法: HMGET key field [field ...]
127.0.0.1:6379> hmget user age name gender
1) "20"
2) "wl"
3) "male"
获取所有字段值语法:HGETALL key
127.0.0.1:6379> hgetall user
1) "name"
2) "wl"
3) "age"
4) "20"
5) "gender"
6) "male"
删除字段语法:HDEL key field [field ...]
127.0.0.1:6379> hdel user gender
(integer) 1
队列List
Redis的list是采用来链表来存储,双向链表存储数据,特点:增删快、查询慢(Linkedlist).这个队列是有序的。
向列表左边增加元素: LPUSH key value [value ...]
从列表左边弹出元素: LPOP key(临时存储,弹出后,从队列中清除)
127.0.0.1:6379> lpush list 20 30 50 100
(integer) 4
127.0.0.1:6379> lpop list
"100"
向列表右边增加元素 : RPUSH key value [value ...]
从列表右边弹出元素: RPOP key
127.0.0.1:6379> rpush list 99 999 9999
(integer) 6
127.0.0.1:6379> rpop list
"9999"
127.0.0.1:6379> rpop list
"999"
获取列表中元素的个数: LLEN key
127.0.0.1:6379> llen list
(integer) 4
查看列表语法:LRANGE key start stop
127.0.0.1:6379> lrange list 0 2
1) "50"
2) "30"
3) "20"
127.0.0.1:6379> lrange list 0 -1
1) "50"
2) "30"
3) "20"
4) "99"
将返回start、stop之间的所有元素(包含两端的元素),索引从0开始,可以是负数,如:“-1”代表最后的一个元 素。
Set集合
Set集合类型:无序、不可重复
增加元素语法:SADD key member [member ...]
删除元素语法: SREM key member [member ...]
获得集合中的所有元素 : smembers key
127.0.0.1:6379> sadd st u1
(integer) 1
127.0.0.1:6379> sadd st u3
(integer) 1
127.0.0.1:6379> sadd st u2
(integer) 1
127.0.0.1:6379> smembers st
1) "u2"
2) "u3"
3) "u1"
127.0.0.1:6379> srem st u2
(integer) 1
127.0.0.1:6379> smembers st
1) "u3"
2) "u1"
判断元素是否在集合中: SISMEMBER key member
127.0.0.1:6379> sismember st u1
(integer) 1
127.0.0.1:6379> sismember st u2
(integer) 0

浙公网安备 33010602011771号