NOSQL数据库之 REDIS
NOSQL数据库之 REDIS
一、NOSQL
1、简介
NoSQL ,(Not Only SQL),泛指非关系型数据库。
特点:
NoSQL 通常是以key-value形式存储,
不支持SQL语句,
没有表结构
2、优缺点:
优点:
高并发读写的性能
大数据量的扩展(分布式存储)
配置简单
灵活、高效的操作与数据模型
低廉的成本
不足之处:
没有统一的标准
没有正式的官方支持
各种产品还不算成熟
3、常见nosql产品


二、redis介绍
1、概述
(1)Redis是Remote Dictionary Server(远程数据服务)的缩写.
由意大利人antirez(Salvatore Sanfilippo)开发的一款内存高速缓存数据库
(2)该软件使用C语言编写,它的数据模型为key-value
(3)它支持存储的value类型很多,包括string(字符串)、hash(哈希)、list(链表)、set(集合)、Zset(有序集合)。
(4)为了保证效率数据都是缓存在内存中,它也可以周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件。
2、特点
1)高速读取数据(in-memory)
2)减轻数据库负担
3)有集合计算功能(优于普通数据库和同类别产品)
4)多种数据结构支持
3、适合场合及其优势
1)[Sort Set]排行榜应用,取top n操作,例如sina微博热门话题
2)[List]获得最新N个数据 或 某个分类的最新数据
3)计数器应用
4)[Set]sns(social network site)获得共同好友
5)[Set]防攻击系统(ip判断)等等
4、与memcache比较说明
redis与memcache比较
(1)数据类型:memcache支持的数据类型就是字符串,redis支持的数据类型有字符串,哈希,链表,集合,有序集合。
(2)持久化:memcache数据是存储到内存里面,一旦断电,或重启,则数据丢失。redis数据也是存储到内存里面的,但是可以持久化,周期性的把数据给保存到硬盘里面,导致重启,或断电不会丢失数据。
(3)数据量:memcahce一个键存储的数据最大是1M,而redis的一个键值,存储的最大数据量是1G的数据量。
三、安装启动
1、安装软件
(1)下载软件,并上传到linux的服务器
Redis的官方下载站是http://redis.io/download


(2)解压软件:


(3)进入解压的目录

(4)无需配置,直接编译
直接执行:make

(5)执行安装,
注意:在安装时,指定安装目录
make PREFIX=/usr/local/redis install

安装完成后,会在redis的 安装目录下面创建一个bin目录,该目录里面有5个文件。

redis-benchmark命令性能测试命令
redis-check-aof和redis-check-dump是日志检测工具
redis-server是服务器端启动的命令。
redis-cli是客户端连接服务器的命令。
(6)复制配置文件
从 redis的解压目录里面把redis.conf配置文件复制到redis的安装目录下面。

2、启动
(1)使用vim打开配置文件redis.conf,修改如下参数:

(2)启动redis服务
语法:命令 配置文件
redis-server(路径) redis.conf(路径)
注意:此处命令与配置文件,可以写相对路径或绝对路径。
比如使用绝对路径写法: /usr/local/redis/bin/redis-server /usr/local/redis/redis.conf

查看是否启动成功:启动成功后,默认的端口是6379
netstat –tunpl | grep 6379
(3)客户端连接redis服务
语法: 连接命令 -h 主机ip -p端口号
如果是连接到本地,则直接输入连接命令即可。
redis-cli是客户端连接服务器的命令

(4)关闭redis的服务
停止Redis实例
我们可以使用/usr/local/redis/bin/redis-cli shutdown
也可以使用pkill redis-server
killall redis-server

四、数据类型讲解
1、字符串(string)
string是redis最基本的类型
redis的string可以包含任何数据。包括jpg图片或者序列化的对象。
单个value值最大上限是1G字节, 如果只用string类型,redis就可以被看作加上持久化特性(服务器重启之后,数据不丢失)的memcache
(1)set
设置键,值
语法:set 键名称 值
例如:我们添加一个name=“xiaoqian”的键值对。
注意:重新设置则直接覆盖。

(2)get
获取key对应的string值,如果key不存在返回 nil,
语法:get 键值

(3)incr
对key的值做加加操作,并返回新的值,每执行一次值加1,值类型要是数据类型。
语法:incr key

(4)incrby
执行加法的命令,可以指定相加的值,

2、hash
hash可以用来存储对应的mysql中一行的数据,类似于关联数组。
(1)hset
设置哈希里面的field和vlaue的值。
语法:
hset 哈希的名称(键名称) field value

(2)hget
获取哈希里面的field的值
语法:hget 哈希的名称(键名称) 指定的field

注意:user:id:1 名称里面的:符号,就表示一个普通符号,没有任何含义。
(3)hmset
一次性设置多个field和value
语法: hmset 哈希的名称 field1 value1 field2 value2……

(4)hmget
一次性获取 多个field的value
语法:hmget 哈希的名称 field1 field2…….

(5)hgetall
获取指定哈希中所有的field和value
语法:
hgetall 哈希的名称

3、链表(list)
list类型其实就是一个双向链表。通过push,pop操作从链表的头部或者尾部添加删除元素。
这使得list既可以用作栈,也可以用作队列。
上进上出 :栈 ,特点:数据 先进后出

下进上出 :队列,特点:数据 先进先出

(1)lpush
从链表的头部添加元素
语法: lpush 链表的名称(键的名称) 元素

(2)lrange
获取链表里面的元素
语法:
lragne 链表的名称 开始下标 结束下标
注意:如果开始下标是0结束下标是-1则是返回链表中所有的元素。
注意:链表里面的元素是序号的(从0开始数),类似于索引数组。


(3)rpush
从链表的尾部添加元素
语法: rpush 链表的名称(键的名称) 元素

(4)ltrim
保留指定范围的元素
语法:ltrim 链表的名称 开始下标 结束下标

(5)lpop
从链表的头部删除一个元素,返回删除的元素
语法:lpop 链表的名称

比如如下案例:一个网站中,想要获取最新登录的10个用户。
使用传统的方法解决,查询用户表,根据登录时间排序,截取前10位。
类似于如下sql语句
select * from user order by login_time desc limit 10;
以上sql语句,如果用户数量庞大,则执行效率比较低,可以把登录的用户存储到redis的链表里面,
如果通过list链表实现以上功能,可以在list链表中只保留最新的10个数据,每进来一个新数据就删除一个旧数据。每次就可以从链表中直接获得需要的数据。极大节省各方面资源消耗

4、集合(set)
redis的set是string类型的无序集合。
set元素最大可以包含(2的32次方-1)(整型最大值)个元素。
关于set集合类型除了基本的添加、删除操作,其他有用的操作还包含集合的取并集(union),交集(intersection),差集(difference)。通过这些操作可以很容易的实现sns中的好友推荐功能。
sina公司的好友关注关系就大量使用了set集合类型。
注意:每个集合中的各个元素不能重复。

该类型应用场合:qq好友推荐。
tom朋友圈(与某某是好友):mary jack xiaoming wang5 wang6
linken朋友圈(与某某是好友):yuehan daxiong luce wang5 wang6
(1)sadd
向集合中添加元素
语法:
sadd 集合名(键名) 元素名称

(2)smembers
获取集合中的元素
语法:
smembers 集合名

(3)sdiff
获取集合中的差集(在集合1中存在,不在集合2中存在的元素)
语法:sdiff 集合1 集合2

(4)sinter
获取交集(在两个集合中都存在的元素)
语法:sinter 集合1 集合2

(5)sunion
求并集(两个集合合并后,去掉重复的元素)
语法:sunion 集合1 集合2

(6)scard
获取集合中元素的个数
语法:scard 集合名称

5、(有序集合)zset
sorted set是set的一个升级版本,他在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。操作中的key理解为zset的名字。
(1)zadd
向有序集合中添加元素。如果该元素存在,则更新其顺序。
语法:zadd 集合名 序号 内容

(2)zrange
(把集合排序后,返回名次[start,stop]的元素
默认是升续排列
Withscores 是把score也打印出来
)
按序号升序获取有序集合中的内容,
语法:zrange 集合名称 开始下标 结束下标

(3)zrevrange
按序号降序获取有序集合中的内容。
语法:zrevrange 集合名称 开始下标(索引) 结束下标(索引)

五、Redis常用命令
redis提供了丰富的命令对数据库和各种数据库类型进行操作,这些命令可以在linux终端使用。
1、键值相关的命令
2、服务器相关命令
(1)keys
返回当前数据库里面的键,可以使用通配符,* 表示:任意多个,?任意一个字符。

(2)exists
判断一个键是否存在。
语法:exists 键名称

(3)del
删除指定的键
语法: del 键名称

(4)expire
设置键的有效期
语法:expire key 有效期(秒数)

(5)ttl
返回一个键剩余的过期时间.


(6)type
返回数据类型
语法: type key

(7)select
选择数据库,在redis里面默认有0-15号数据库,默认是0号数据库,
可以通过redis.conf配置文件进行设置。

切换数据库语法:select 数据库的编号

(8)dbsize
返回当前数据库里面键的个数

(9)flushdb
清空当前数据库里面所有的键,(慎重使用)

(10)flushall
清空所有数据库里面的所有的键,(慎重使用)

六、安全认证
设置客户端连接后进行任何其他操作前需要使用的密码。
方法:打开redis的配置文件(redis.conf)
(1)#requirepass 设置的密码

注意:设置的密码是明文的,因此要对redis.conf配置文件,进行严格的授权。
(2)重启redis服务,让密码生效。
关闭redis服务 pkill redis-server
启动 /usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
(3)客户端验证方式:
注意:如果没有通过验证,则无法操作:

方式一:
通过客户端登录到服务器时,添加 -a 选项。语法:redis-cli –a 密码

方式二;
登录到服务器端后,使用auth命令来完成验证。语法auth 密码。

持久化机制
redis为了内存数据的安全考虑,会把内存中的数据以文件形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)的里边。
数据保存到硬盘的过程就称为“持久化”效果。
redis支持两种持久化方式:
(1)snapshotting(快照)默认方式
(2)append-only file(缩写aof)的方式
1、snapshotting快照方式持久化
该持久化默认开启,一次性把redis中全部的数据保存一份存储在硬盘中(备份文件名字默认是dump.rdb),如果数据非常多(10-20G)就不适合频繁进行该持久化操作。
(1)如何开启,默认开启,有自己的触发条件:


注意:屏蔽该触发条件,即可关闭快照方式。
(2)可以设置保存位置,和备份的文件名
备份文件名字默认是dump.rdb,我们也可以自己修改,
可以通过配置文件,来完成修改。

(3)手动发起快照:
两种方式完成手动保存。
方式一:在登录状态:
则直接执行bgsave即可。

方式二 :在没有登录状态
./redis-cli bgsave 手动发起一次快照保存操作

(4)缺点:
由于快照方式是在一定间隔做一次的,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改。
2、append-only-file 追加方式持久化AOF
本质:把用户执行的每个“写”指令(添加、修改、删除)都备份到文件中,还原数据的时候就是执行具体写指令而已。
(1)如何开启
appendonly yes //启用 aof 持久化方式
appendfilename appendonly.aof //保存命令的文件(可以指定路径)
打开redis.conf配置文件,进行打开配置。

(2)触发条件
# appendfsync always //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用
appendfsync everysec //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐
# appendfsync no //完全依赖 os,性能最好,持久化没保证
打开配置文件进行如下修改。


(3)aof文件的重写:
例如:可以把多个incr指令换为一个set指令
问题:
每个命令重写一次aof,如果某个key操作100次,产生100行记录,aof文件会很大,怎么解决?
比如,当执行多次incr number操作,aof 文件中会保存多次incr number的命令。这样会增大aof文件容量,我们可以对aof文件重写,把里面重复的命令压缩成一条命令。
就比如执行10次incr number 压缩成set number 11
执行重写的命令是:
执行重写可以在登录状态下执行,直接输入bgrewriteaof,也可以在未登录状态下执行,
语法:./bin/redis-cli –a 密码 bgrewriteaof

注意点:如果两种持久化方式都开启,则以aof为准。
NOSQL数据库之 REDIS的更多相关文章
- Python操作nosql数据库之redis
一.NoSQL的操作 NoSQL,泛指非关系型的数据库.随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不 ...
- nosql数据库之Redis概念及基本操作
一.概述 redis是一种nosql数据库(非关系型数据库),他的数据是保存在内存中,同时redis可以定时把内存数据同步到磁盘,即可以将数据持久化,并且他比memcached支持更多的数据结构(st ...
- Linux实战教学笔记45:NoSQL数据库之redis持久化存储(一)
第1章 redis存储系统 1.1 redis概述 REmote DIctionary Server(Redis)是一个基于key-value键值对的持久化数据库存储系统.redis和大名鼎鼎的Mem ...
- NoSQL数据库:Redis适用场景及产品定位
传统MySQL+ Memcached架构遇到的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量 ...
- NoSQL数据库之Redis数据库:Redis的介绍与安装部署
NoSQL(NoSQL = Not Only SQL),它指的是非关系型的数据库.随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的w ...
- NoSQL数据库:Redis内存使用优化与存储
Redis常用数据类型 Redis最为常用的数据类型主要有以下五种: ●String ●Hash ●List ●Set ●Sorted set 在具体描述这几种数据类型之前,我们先通过一张图了解下Re ...
- 大数据笔记(二十一)——NoSQL数据库之Redis
一.Redis内存数据库 一个key-value存储系统,支持存储的value包括string(字符串).list(链表).set(集合).zset(sorted set--有序集合)和hash(哈希 ...
- no-sql数据库之redis
一.FAQ 1.如果用连接器连接redis不成功,报如下错误: crash-report-server replied:Request Entity Too Large 则可以先通过cmd命令查看端口 ...
- Linux实战教学笔记46:NoSQL数据库之redis持久化存储 (二)
第3章 Redis数据类型详解 3.1 Redis键/值介绍 Redis key值是二进制安全的,这意味着可以用任何二进制序列作为key值,从形如"foo"的简单字符串到一个JPG ...
随机推荐
- 将近半个小时,把一小段简短的汇编代码写成了C语言代码
我自己看,感觉好像一句一句翻译的,写得很是生硬,不如书上写的灵活 0040137E 8B7424 04 MOV ESI,DWORD PTR SS:[ESP+4]00401382 ...
- Foundation框架系列-NSDictionary
排序 对字典中的key按照字母升序排序 // NOTE: 排序,得出最终请求字串 NSArray* sortedKeyArray = [[tmpDict allKeys] sortedArrayUsi ...
- Caffe系列3——制作Hdf5数据源详细教程(手把手教你制作Hdf5数据源)
制作Hdf5数据源详细教程
- 模块介绍/time/os...
本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configpars ...
- 爬虫——python——百度地图经纬度查询——经纬度查看地点地名——利用百度API获取地名经纬度——爬取所有的中国地址
import requests address = '40.8587960,86.866991' url = 'http://api.map.baidu.com/geocoder?output=jso ...
- 使用jqselectable构建美化的select元素
本文只对此插件的应用做一些探讨,本插件版权属于原作者,插件原始下载地址:http://www.jq22.com/jquery-info288 原插件也有些许不足之处,比如样式定义名称太过普通,容易和页 ...
- JS全局函数里面的一些区别
- 关于SqlServer的内连接,外链接以及left join,right join之间的一些问题与区别。
就我个人理解通俗点来说内连接和外连接区别: 内连接 inner join或者 join (被默认为内连接) : 内连接的原理是:先进行语句判断和运行得出结果,然后在将结果连接起来,一般是横着连接. 外 ...
- 【neo4j】neo4j Desktop1.1.9,windows 安装
一.neo4j 介绍 Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中.它是一个嵌入式的.基于磁盘的.具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储 ...
- springboot自己实现mysql主从数据切换机制
在很多公司都是实现了数据的读写分离,所谓的读写分离,就是写的时候从主库 ,然后从库就会从主库中复制过去,这样就会形成了数据的读写分离,然而在很多场景是适用的,那么我们怎么做呢,可以利用aop 加注解的 ...