学名(not only sql)
特色:
存储结构与mysql这一种关系型数据库彻底不一样,nosql存储的是KV形式
nosql有不少产品,都有本身的api和语法,以及业务场景
产品种类:
Mongodb
redis
Hbase hadoop
Nosql 与sql 的区别php
应用场景不一样,sql支持关系复杂的数据查询,nosql反之
sql支持事务性,nosql不支持
redis特性mysql
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它能够用做数据库、缓存和消息中间件 redis是c语言编写的,支持数据持久化,是key-value类型数据库。 应用在缓存,队列系统中 redis支持数据备份,也就是master-slave模式
redis 优点linux
性能高,读取速度10万次每秒
写入速度8万次每秒
全部操做支持原子性
用做缓存数据库,数据放在内存中
替代某些场景下的mysql,如社交类app
大型系统中,能够存储session信息,购物车订单
#前提得配置好阿里云yum源,epel源 #查看是否有redis包 yum list redis #安装redis yum install redis -y #安装好,启动redis systemctl start redis redis-cli #redis 客户端工具 #进入交互式环境后,执行ping,返回pong表示安装成功 127.0.0.1:6379> ping PONG
源码安装 编译安装nginx
编译安装的优点是:redis
编译安装时能够指定扩展的module(模块),php、apache、nginx都是同样有不少第三方扩展模块,如mysql,编译安装时候,若是须要就定制存储引擎(innodb,仍是MyIASM)sql
编译安装能够统一安装路径,linux软件约定安装目录在/opt/下面数据库
软件仓库版本通常比较低,编译源码安装能够根据需求,安装最新的版本apache
1.下载redis源码 wget http://download.redis.io/releases/redis-4.0.10.tar.gz 2.解压缩 tar -zxf redis-4.0.10.tar.gz 3.切换redis源码目录 cd redis-4.0.10.tar.gz 4.编译源文件 make 5.编译好后,src/目录下有编译好的redis指令 6.make install 安装到指定目录,默认在/usr/local/bin
redis 可执行文件api
./redis-benchmark //用于进行redis性能测试的工具 ./redis-check-dump //用于修复出问题的dump.rdb文件 ./redis-cli //redis的客户端 ./redis-server //redis的服务端 ./redis-check-aof //用于修复出问题的AOF文件 ./redis-sentinel //用于集群管理
redis.conf 核心配置项缓存
绑定ip,如须要远程访问,须要填写服务器ip bind 127.0.0.1 端口,redis启动端口 port 守护进程方式运行 daemonize yes rdb数据文件 dbfilename dump.rdb 数据文件存放路径 dir /var/lib/redis/ 日志文件 logfile /var/log/redis/redis-server.log 主从复制 slaveof
举例: 第一种方法: redis的安装方式 1.yum install redis -y
第二种方法: 源码编译(在选择编译的时候,注意删掉以前的yum安装的) 1.yum remove redis -y 2.下载redis的源代码包 wget http://download.redis.io/releases/redis-4.0.10.tar.gz 3.解压缩源码包 编译三部曲: #(此redis压缩包,已经提供好了makefile,只须要执行,编译的第二,第三曲) 2.执行gcc的make指令,执行makefile文件 make 3.开始安装 make install 4.会安装在当前的源码包中的src目录,且帮你配置好了PATH变量 经过redis-加上tab补全查看全部命令 redis-benchmark redis-check-rdb redis-sentinel redis-check-aof redis-cli redis-server 5.制定一个安装可靠的redis数据库,以下功能经过配置文件定义 1.更改端口 2.设置密码 3.开启redis的安全启动模式 默认直接输入redis-server能够启动服务端,默认端口6379,且没有密码 redis-cli登陆 redis.conf 内容以下,有多少参数,就有多少功能, bind 192.168.16.142 #绑定redis启动的地址 protected-mode yes #开启redis的安全模式,必须输入密码才能够远程登陆 port 6380 #指定redis的端口 daemonize no #让redis以守护进程方式在后台运行,不占用窗口 pidfile /var/run/redis_6379.pid #记录redis的进程id号的文件 loglevel notice #日志运行等级 .严重级别,警告级别,debug调试界别.....logging requirepass haohaio #设置redis的密码,是 haohaio 建立新的配置文件
grep -v '^#' redis.conf |grep -v '^$' > ./s20.conf
指定配置文件的启动方式 redis-server s20redis.conf #此时登陆redis必须加上参数了,而且登陆了以后,必须输入密码才可使用 redis-cli -p 6380 -h 192.168.16.142
auth 密码
启动服务端 客户端
启动redis很是简单,直接./redis-server就能够启动服务端了,还能够用下面的方法指定要加载的配置文件: ./redis-server ../redis.conf 默认状况下,redis-server会以非daemon的方式来运行,且默认服务端口为6379。 #执行客户端命令便可进入 ./redis-cli #测试是否链接上redis 127.0.0.1:6379 > ping 返回pong表明链接上了 //用set来设置key、value 127.0.0.1:6379 > set name "chaoge" OK //get获取name的值 127.0.0.1:6379 > get name "chaoge"
redis是一种高级的key:value存储系统,其中value支持五种数据类型
字符串(strings)
散列(hashes)
列表(lists)
集合(sets)
有序集合(sorted sets)
基本命令
keys * 查看全部key type key 查看key类型 expire key seconds 过时时间 ttl key 查看key过时剩余时间 -2表示key已经不存在了 persist 取消key的过时时间 -1表示key存在,没有过时时间 exists key 判断key存在 存在返回1 不然0 del keys 删除key 能够删除多个 dbsize 计算key的数量
数据结构
1 strings 类型
set 设置key get 获取key append 追加string mset 设置多个键值对 mget 获取多个键值对 del 删除key incr 递增+1 decr 递减-1
127.0.0.1:6379> set name 'yu' #设置key OK 127.0.0.1:6379> get name #获取value "yu" 127.0.0.1:6379> set name 'yuchao' #覆盖key OK 127.0.0.1:6379> get name #获取value "yuchao" 127.0.0.1:6379> append name ' dsb' #追加key的string (integer) 10 127.0.0.1:6379> get name #获取value "yuchao dsb" 127.0.0.1:6379> mset user1 'alex' user2 'xiaopeiqi' #设置多个键值对 OK 127.0.0.1:6379> get user1 #获取value "alex" 127.0.0.1:6379> get user2 #获取value "xiaopeiqi" 127.0.0.1:6379> keys * #找到全部key 1) "user2" 2) "name" 3) "user1" 127.0.0.1:6379> mget user1 user2 name #获取多个value 1) "alex" 2) "xiaopeiqi" 3) "yuchao dsb" 127.0.0.1:6379> del name #删除key (integer) 1 127.0.0.1:6379> get name #获取不存在的value,为nil (nil) 127.0.0.1:6379> set num 10 #string类型实际上不只仅包括字符串类型,还包括整型,浮点型。redis可对整个字符串或字符串一部分进行操做,而对于整型/浮点型可进行自增、自减操做。 OK 127.0.0.1:6379> get num "10" 127.0.0.1:6379> incr num #给num string 加一 INCR 命令将字符串值解析成整型,将其加一,最后将结果保存为新的字符串值,能够用做计数器 (integer) 11 127.0.0.1:6379> get num "11" 127.0.0.1:6379> decr num #递减1 (integer) 10 127.0.0.1:6379> decr num #递减1 (integer) 9 127.0.0.1:6379> get num "9"
list 类型
lpush 从列表左边插
rpush 从列表右边插
lrange 获取必定长度的元素 lrange key start stop
ltrim 截取必定长度列表
lpop 删除最左边一个元素
rpop 删除最右边一个元素
lpushx/rpushx key存在则添加值,不存在不处理
lpush duilie 'alex' 'peiqi' 'ritian' #新建一个duilie,从左边放入三个元素 llen duilie #查看duilie长度 lrange duilie 0 -1 #查看duilie全部元素 rpush duilie 'chaoge' #从右边插入chaoge lpushx duilie2 'dsb' #key存在则添加 dsb元素,key不存在则不做处理 ltrim duilie 0 2 #截取队列的值,从索引0取到2,删除其他的元素 lpop #删除左边的第一个 rpop #删除右边的第一个
set 集合类型
redis的集合,是一种无序的集合,集合中的元素没有前后顺序。 集合相关的操做也很丰富,如添加新元素、删除已有元素、取交集、取并集、取差集等。咱们来看例子: sadd/srem 添加/删除 元素 sismember 判断是否为set的一个元素 smembers 返回集合全部的成员 sdiff 返回一个集合和其余集合的差别 sinter 返回几个集合的交集 sunion 返回几个集合的并集
sadd zoo wupeiqi yuanhao #添加集合,有三个元素,不加引号就当作字符串处理
smembers zoo #查看集合zoo成员
srem zoo wupeiqi #删除zoo里面的alex
sismember zoo wupeiqi #返回改是不是zoo的成员信息,不存在返回0,存在返回1
sadd zoo wupeiqi #再把wupeiqi加入zoo
smembers zoo #查看zoo成员
sadd zoo2 wupeiqi mjj #添加新集合zoo2
sdiff zoo zoo2 #找出集合zoo中有的,而zoo2中没有的元素
sdiff zoo2 zoo #找出zoo2中有,而zoo没有的元素
sinter zoo zoo1 #找出zoo和zoo1的交集,都有的元素
sunion zoo zoo1 #找出zoo和zoo1的并集,全部的不重复的元素
有序集合
都是以z开头的命令
用来保存须要排序的数据,例如排行榜,成绩,工资等。
实例
利用有序集合的排序,排序学生的成绩
127.0.0.1:6379> ZADD mid_test 70 "alex" (integer) 1 127.0.0.1:6379> ZADD mid_test 80 "wusir" (integer) 1 127.0.0.1:6379> ZADD mid_test 99 "yuyu"
排行榜,zrevrange 倒叙 zrange正序 127.0.0.1:6379> ZREVRANGE mid_test 0 -1 withscores 1) "yuyu" 2) "99" 3) "wusir" 4) "80" 5) "xiaofneg" 6) "75" 7) "alex" 8) "70" 127.0.0.1:6379> ZRANGE mid_test 0 -1 withscores 1) "alex" 2) "70" 3) "xiaofneg" 4) "75" 5) "wusir" 6) "80" 7) "yuyu" 8) "99"
哈希数据结构
哈希结构就是 k1 -> k1 : v1 如同字典 套字典 { k1 : { k2: v2 } } ,取出v2 必须 k1,取出k2 hashes即哈希。哈希是从redis-2.0.0版本以后才有的数据结构。 hashes存的是字符串和字符串值之间的映射,好比一个用户要存储其全名、姓氏、年龄等等,就很适合使用哈希。 hset 设置散列值 hget 获取散列值 hmset 设置多对散列值 hmget 获取多对散列值 hsetnx 若是散列已经存在,则不设置(防止覆盖key) hkeys 返回全部keys hvals 返回全部values hlen 返回散列包含域(field)的数量 hdel 删除散列指定的域(field) hexists 判断是否存在
redis hash是一个string类型的field和value的映射表 语法 hset key field value hset news1 title "first news title" #设置第一条新闻 news的id为1,添加数据title的值是"first news title" hset news1 content "news content" #添加一个conntent内容 hget news1 title #获取news:1的标题 hget news1 content #获取news的内容 hmget news1 title content #获取多对news:1的 值 hmset news2 title "second news title" content "second Contents2" #设置第二条新闻news:2 多个field hmget news2 title content #获取news:2的多个值 hkeys news1 #获取新闻news:1的全部key hvals news1 #获取新闻news:1的全部值 hlen news1 #获取新闻news:1的长度 hdel news1 title #删除新闻news:1的title hlen news1 #看下新闻news:1的长度 hexists news1 title #判断新闻1中是否有title,不存在返回0,存在返回1