数据库类型
关系数据库与非关系型数据库
存储数据类型分类
结构化数据:可以用过二位表格形式表述这个数据
非结构化数据:不方便以二维表格形式表述的这种类型的数据
关系型数据库
一个结构化的数据库,创建在关系模型基础上
—般面向于记录
包括Oracle、MySQL、SQL Server、Microsoft Access、DB2等
非关系型数据库
除了主流的关系型数据库外的数据车,都认为是非关系型
包括Redis、MongBD、Hbase、CouhDB
非关系型数据库产生背景
High performance—对数据库高并发读写需求
Huge Storage—对海量数据高效存储与访问需习
High Scalability && High Availability—对数据库高可扩展性与高可用性需求
Redis简介
Redis基于内存运行并支持持久化
采用key-value(键值对)的存储形式
**优点**
具有极高的数据读写速度
支持丰富的数据类型
支持数据的持久化
原子性
支持数据备
Redis支持五种数据类型
1.string(字符串)
string是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value
string类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象
string类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB
2. hash(哈希)
Redis hash 是一个键值(key=>value)对集合
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象
3. list(列表)
Redis列表是简单的字符串列表,按照插入顺序排序
可以添加一个元素到列表的头部(左边)或者尾部(右边)
4. set(集合)
Redis 的 Set 是 string 类型的无序集合
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)
sadd命令
添加一个 string 元素到 key 对应的 set 集合中,成功返回 1,如果元素已经在集合中返回 0
scard:查看set数据中存在的元素个数
sismember:判断set数据中是否存在某个元素
srem:删除某个set数据中的元素
5. zset(sortedset:有序集合)
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序
zset的成员是唯一的,但分数(score)却可以重复
zadd 命令
添加元素到集合,元素在集合中存在则更新对应score
zcard:查询
zrang:数据排序
类型 | 简介 | 特性 | 场景 |
---|---|---|---|
String(字符串) | 二进制安全 | 可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M | … |
Hash(字典) | 键值对集合,即编程语言中的Map类型 | 适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去) | 存储、读取、修改用户属性 |
List(列表) | 链表(双向链表) | 增删快,提供了操作某一段元素的API | 1.最新消息排行等功能(比如朋友圈的时间线) 2.消息队列 |
Set(集合) | 哈希表实现,元素不重复 | 1.添加、删除,查找的复杂度都是 O(1) 2.为集合提供了求交集、并集、差集等操作 | 1.共同好友 2.利用唯一性,统计访问网站的所有独立ip 3.好友推荐时,根据tag求交集,大于某个阈值就可以推荐 |
Sorted Set | 将Set中的元素增加 | 数据插入集合时,已经进行天然排序 | 1.排行榜 2.带权重的消息队列 |
Set(有序集合) | 一个权重参数score,元素按score有序排列 |
redis与memcached比较
支持的存储类型不同
虽然redis和memcached都是内存型数据库,并且memcached不仅能够存储string类型,还能够存储图片、文件、视频等格式的文件。然而对于更多的使用内存数据库做缓存以及分布式方案的程序开发者来说,memcached提供的string类型存储的应用场景非常有限,而存储图片视频的功能又十分鸡肋(许多公司的用户场景是没这方面需求)。相比之下,redis提供set,hash,list等多种类型的存储结构,非常适合分布式缓存的实现。
数据落盘
memcached 数据不可恢复,虽然大多数人使用缓存以及分布式方案都不会要求数据持久化,但是谁也不能保证不出现万一的情况。一旦发生稳定性问题,memcached挂掉后,数据是不可恢复的,而redis除了支持在配置里打开数据落盘(RDB),还能通过aof来找回数据。
内存空间与数据量
memcached可以修改最大内存,使用的是LRU算法,而redis目前底层使用了自己的VM,引入了新的特性突破了物理内存的限制。个人认为在这方面依然是redis更加优秀一些。value值-redis最大可以达到1GB,而memcache只有1MB;
使用场景
会话缓存(SessionCache)
最常用的一种使用Redis的情景是会话缓存(session cache)。用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的
全页缓存(FPC)
基本的会话token之外,Redis还提供很简便的FPC平台。回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP本地FPC
队列
Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作
排行榜/计数器
Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构
发布/订阅
最后(但肯定不是最不重要的)是Redis的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统
其他
但是如果是对缓存的数据格式有更多的要求,且对安全性也有很高的要求的话,建议还是使用redis,这也是redis目前正在逐渐代替memcached的根本原因
**总结**
Memcached | Redis | |
---|---|---|
类型 | Key-value数据库 | Key-value数据库 |
过期策略 | √ | √ |
数据类型 | 单一数据类型 | 五大数据类型 |
持久化 | × | √ |
主从复制 | × | √ |
虚拟内存 | × | √ |
安装Redis
上传,解压
tar xf redis-5.0.4.tar.gz
编译安装
cd redis-5.0.4/
make
make PREFIX=/usr/local/redis install
软链接
ln -s /usr/local/redis/bin/* /usr/bin/
安装数据库
cd redis-5.0.4/utils/
./install_server.sh
全部回车
netstat -anpt | grep redis
修改配置文件
vi /etc/redis/6379.conf
bind 192.168.1.10 127.0.0.1 #增加本机地址
重启服务
/etc/init.d/redis_6379 stop
/etc/init.d/redis_6379 start
连接redis
redis-cli -h 192.168.1.10 -p 6379
数据类型
string(字符串)
实例:set 键 值 设置键值对 get 键 获取键的值
set chen 5 #chen为键名称,10为键的值,可自行设定
查看类型
type chen
获取键的值
get chen
增加键的值
incr chen
减少键的值
decr chen
指定增加键的值的幅度
incrby chen 5 #指定增加键的值+5
指定减少键的值的幅度
decrby chen 5 #指定减少键的值-5
hash(哈希)
单个字段存入
hset hash1 key1 a #存入N个单独字段
多个字段存入
Hset hash1 field1 a1 field2 b2
List(列表)
左入3个列表
lpush:从左边推入值 lpop
lpush list1 1
lpush list1 2
lpush list1 3
从左边弹出值 rpush 从右边推入值 rpop
lpop list1
查看列表长度
llen list1
列出所有list1的值
lrange list1
从右边弹出值
rpop list1
再次列出所有list1的值
set(集合)
添加一个 string 元素到 key 对应的 set 集合中,成功返回 1,如果元素已经在集合中返回 0
sadd set1 1
sadd set1 2
sadd set1 2
查看set数据中存在的元素个数
scard set1
判断set数据中是否存在某个元素
sismember set1 1 #有就查到 没有就查不到
删除某个set数据中的元素
srem set1 1 # 删除
sismember set1 1 # 查看
列出set1所有值
添加元素列出
sadd set1 5
sadd set1 10
sadd set1 1
sadd set1 4
zset(sortedset:有序集合)
添加元素到集合,元素在集合中存在则更新对应score
zadd zset1 1.1 val1
zadd zset1 2.2 val2
zadd zset1 3.3 val3
zadd zset1 1 val5
zrang:数据排序
zrange zset1 0 10 withscores