NoSQL概述 not only sql 属于非关系型数据库
nosql产品:MongoDB 、Redis
存储类型:四大分类
1、键值对(Key-Value)存储的数据库
2、列存储
3、文档数据库
4、图形数据库
特点:
1、易扩展
2、灵活的数据模型
3、大数据量,高性能
4、高可用
redis支持五种数据类型:string(字符串)、hash(哈希),list(列表),set(集合)和zset(sorted set:有序集合)。
String类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象。
string类型是Redis最基本的数据类型,一个键最大能存储512MB
Hash(哈希)
redis hash是一个键值(key=>value)对集合。
redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
list(列表)
redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
实例:
1 127.0.0.1:6379> lpush runoob shidong #左侧插入 2 (integer) 5 3 127.0.0.1:6379> lpush runoob zhangmeilin 4 (integer) 6 5 127.0.0.1:6379> 6 127.0.0.1:6379> lrange runoob 0 5 7 1) "zhangmeilin" 8 2) "shidong" 9 3) "eku" 10 4) "rabitmq" 11 5) "mongodb" 12 6) "redis" 13 127.0.0.1:6379> rpush runoob yuinsa #右侧插入 14 (integer) 7 15 127.0.0.1:6379> lrange runoob 0 5 16 1) "zhangmeilin" 17 2) "shidong" 18 3) "eku" 19 4) "rabitmq" 20 5) "mongodb" 21 6) "redis" 22 127.0.0.1:6379> lrange runoob 0 6 23 1) "zhangmeilin" 24 2) "shidong" 25 3) "eku" 26 4) "rabitmq" 27 5) "mongodb" 28 6) "redis" 29 7) "yuinsa"
列表最多可存储2的32次方减1元素(每个列表最多可存储40多亿)
set(集合)
redis的set是string类型的无序集合。
集合是通过哈希表实现的,所以添加、删除、查找的复杂度是O(1)
sadd命令
添加一个string元素到,key对应的set集合中,成功返回1,如果元素已经在集合中返回0,key对应的set不存在返回错误
实例:
1 127.0.0.1:6379> sadd eku redis #集合添加元素用sadd 2 (integer) 1 #添加成功返回1 3 127.0.0.1:6379> sadd eku mongodb 4 (integer) 1 5 127.0.0.1:6379> smembers runoob #集合不存在报错返回error 6 (error) WRONGTYPE Operation against a key holding the wrong kind of value 7 127.0.0.1:6379> smembers eku #查看集合中的元素 8 1) "mongodb" 9 2) "redis" 10 127.0.0.1:6379> sadd eku mongodb 11 (integer) 0 #添加失败返回0
注意:以上实例中MongoDB添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。
集合中最大的成员数为232 - 1(4294967295, 每个集合可存储40多亿个成员)。
zset (sorted set :有序集合)
redis zset 和set一样也是string类型元素的集合,且不允许重复的成员
不同的是每个元素都会关联一个double类型的分数,redis正事通过分数来为集合汇总的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
zadd命令
添加元素到集合,元素在集合中存在则更新对应score
实例:
127.0.0.1:6379> zadd name 0 redis#添加元素 (integer) 1 127.0.0.1:6379> zadd name 0 mongodb (integer) 1 127.0.0.1:6379> zadd name 0 linux (integer) 1 127.0.0.1:6379> zadd name 0 linux (integer) 0 127.0.0.1:6379> zrangebyscore name 0 5 #查看集合元素 1) "linux" 2) "mongodb" 3) "redis" 127.0.0.1:6379> zadd name 1 linux (integer) 0 127.0.0.1:6379> zadd name 1 shidong (integer) 1 127.0.0.1:6379> zadd name 20 eku (integer) 1 127.0.0.1:6379> zrangebyscore name 0 10 1) "mongodb" 2) "redis" 3) "linux" 4) "shidong"
redis连接远程服务器:
用redis-cli连接:
[root@bogon redis]# ./bin/redis-cli -h 192.168.1.222 -p 6379 192.168.1.222:6379> keys * 1) "mykey" 192.168.1.222:6379> set name shidong OK 192.168.1.222:6379> keys * 1) "mykey" 2) "name"
连接成功,并能进行远程操作
redis 键 (key)
redis键命令用于管理redis的键
基本语法:
redis 192.168.222:6379> COMMAND KEY_NAME
redis Dump命令
基本语法:
DUMP KEY_NAME
如果key不存在,那么返回nil,否则,返回序列化之后的值。
实例:
1 127.0.0.1:6379> set name "Hello,dumping world!" 2 OK 3 127.0.0.1:6379> dump name #序列化键值 4 "x00x14Hello,dumping world!x06x00xc8 xdex97xb4xb1xbaW" 5 127.0.0.1:6379> get name 6 "Hello,dumping world!" 7 127.0.0.1:6379> dump not-exists-key #如果序列化的键值不存在,则返回nil 8 (nil)
EXISTS命令:
redis exist是命令用于检查给定key是否存在。
语法:基本语法如下
EXISTS KEY_NAME
可用版本 :>=1.0.0
返回值:若key存在返回1,否则返回0.
实例:
1 127.0.0.1:6379> exists name#检查key是否存在,如果存在返回1 2 (integer) 1 3 127.0.0.1:6379> exists no#如果key不存在返回0 4 (integer) 0
EXPIRE key seconds命令 为给定key设置过期时间。
redis Expire基本语法:
Expire KEY_NAME TIME_IN_SECONDS
可用版本 :>=1.00
返回值:设置成功返回1,当key不存在或者不能为key设置过期时间时(比如在低于2.1.3版本的redis中你尝试更新key的过期时间),返回0
实例:
1 127.0.0.1:6379> get name 2 "Hello,dumping world!" 3 127.0.0.1:6379> EXPIRE name 10#设定过期时间为10S 4 (integer) 1 5 127.0.0.1:6379> get name 6 "Hello,dumping world!" 7 127.0.0.1:6379> get name#10秒后查看,键值name已经被删除了 8 (nil)
EXPIREAT 命令
expireat的作用和expire类似,都用于为key设置过期时间内,不同在于expireat命令接受的时间参数是UNIX时间戳
(unix timestamp)
基本语法如下:
expireat KEY_NAME TIME_IN_UNIX_TIMESTAMP
返回值:设置成功返回1,当key不存在或者不能为key设置过期时间时(比如在低于2.1.3版本的redis中你尝试更改redis的过期时间)返回0.
实例:
1 127.0.0.1:6379> set runoobkey redis 2 OK 3 127.0.0.1:6379> expireat runoobkey 1293840000#设置超时时间 4 (integer) 1 5 127.0.0.1:6379> get runoobkey #超时后自动删除 6 (nil)
PEXPIRE命令
redis Pexpire命令和expire命令的作用类似,但是他是以毫秒为单位设置key的生存时间,而不像expire命令那样是以秒为单位。
基本语法:PEXPIRE key milliseconds
key不存在或设置失败,返回0
实例:
1 127.0.0.1:6379> set runoobkey redis 2 OK 3 127.0.0.1:6379> pexpire runoobkey 10000 #设置时间为1万毫秒 4 (integer) 1 5 127.0.0.1:6379> get runoobkey #查询键值还存在 6 "redis" 7 127.0.0.1:6379> get runoobkey #1万毫秒(十秒)后键值不存在 8 (nil)
PEXPIREAT命令
基本语法:PEXPIREAT KEY_NAME TIME_IN_MILLISECONDS_IN_UNIX_TIMESTAMP
用于设置key的过期时间,以毫秒计,key过期后将不在可用,设置成功返回1,当key不存在或者不能为key设置过期时间时返回0 。设置key过期时间的时间戳(unix timestamp)以毫秒计。
1 127.0.0.1:6379> set name redis 2 OK 3 127.0.0.1:6379> pexpireat name 1555555555005#Unix时间戳 4 (integer) 1 5 127.0.0.1:6379> get name 6 "redis"
KEYS pattern
查找所有符合给定模式(pattern)的key。
redis KEYS命令基本语法如下:
KEYS PATTERN
返回值:符合给定模式的key列表(Array)
实例:首先创建一些key,并附上对应值:
1 127.0.0.1:6379> set name redis 2 OK 3 127.0.0.1:6379> set name1 mysql 4 OK 5 127.0.0.1:6379> set name2 mongodb 6 OK 7 127.0.0.1:6379> keys name* #查找以name开头的键值key 8 1) "name1" 9 2) "name2" 10 3) "name"
move命令
redis move命令用于将当前数据库的key移动到给定的数据库db当中。
move命令基本语法如下:
MOVE KEY_NAME DESTINATION_DATABASE
返回值:移动成功返回1,失败返回0.
实例1:把键值移动到另外一个数据库
1 127.0.0.1:6379> set song "secret base -Zone" #设置键值 2 OK 3 127.0.0.1:6379> move song 1 #移动键值到数据库1 4 (integer) 1 5 127.0.0.1:6379> exists song #在数据库0中键值song已经不存在 6 (integer) 0 7 127.0.0.1:6379> select 1 #选择数据库1 8 OK 9 127.0.0.1:6379[1]> exists song #查看数据库1中键值song是否存在 10 (integer) 1 11 127.0.0.1:6379[1]> get song #查看键值song存在 12 "secret base -Zone"
实例2:当两个数据库中存在相同的key时
1 127.0.0.1:6379[1]> select 0 #选择数据库0 2 OK 3 127.0.0.1:6379> set fruit "banana" #设置key fruit 4 OK 5 127.0.0.1:6379> selct 1 #选择数据库1 6 OK 7 127.0.0.1:6379[1]> set fruit "apple" #设置key fruit 8 OK 9 127.0.0.1:6379[1]> select 0 # 选择数据库0 10 OK 11 127.0.0.1:6379> move fruit 1 #移动key fruit 到数据库1 12 (integer) 0 13 127.0.0.1:6379> get fruit #查看数据库0 的fruit 发现value没变 14 "banana" 15 127.0.0.1:6379> select 1 #切换到数据1 16 OK 17 127.0.0.1:6379[1]> get fruit #查看数据库1 的fruit 发现也没有变化 18 "apple"
PERSIST key 命令
作用:移除给定key的过期时间,key将持久保持不过期
语法命令: PERSIST KEY_NAME
返回值:当过期时间移除成功时,返回1,如果key不存在或key没有设置过期时间,返回0.
实例:
1 127.0.0.1:6379[1]> set name "helo" #设置key-value值 2 OK 3 127.0.0.1:6379[1]> expire name 20 #设定过期时间20秒 4 (integer) 1 5 127.0.0.1:6379[1]> persist name #移除给定key name的过期时间 6 (integer) 1 7 127.0.0.1:6379[1]> get name #查看key name,name存在 8 "helo"
Pttl 命令
redis pttl命令以毫秒为单位返回key的剩余过期时间。
返回值:当key不存在时,返回-2 当key存在但没有设置剩余时间时,返回-1。否则,以毫秒为单位返回key的剩余生存时间。
注意:在redis2.8以前,当key不存在,或者key没有设置剩余生存时间呢时,命令都返回-1。
实例:
1 127.0.0.1:6379[1]> flushdb #清楚redis数据库 2 OK 3 127.0.0.1:6379[1]> pttl key #查看key的剩余过期时间,发现key不存在 4 (integer) -2 5 127.0.0.1:6379[1]> keys * 6 (empty list or set) 7 127.0.0.1:6379[1]> set key value 8 OK 9 127.0.0.1:6379[1]> keys * 10 1) "key" 11 127.0.0.1:6379[1]> get key 12 "value" 13 127.0.0.1:6379[1]> pttl key #没有设置过期时间,但是键值存在返回-1 14 (integer) -1 15 127.0.0.1:6379[1]> pexpire key 10086 #给key设置过期时间 16 (integer) 1 17 127.0.0.1:6379[1]> pttl key #查看剩余时间 18 (integer) 4551 19 127.0.0.1:6379[1]> pttl key 20 (integer) 2671 21 127.0.0.1:6379[1]> pttl key 22 (integer) 1158 23 127.0.0.1:6379[1]> pttl key 24 (integer) 382 25 127.0.0.1:6379[1]> pttl key #剩余时间一到,键值已被删除,返回-2 26 (integer) -2 27 127.0.0.1:6379[1]> get key #查看键值已经不存在 28 (nil)
TTL命令
ttl命令以毫秒为单位返回key的剩余过期时间
ttl命令基本语法:TTL KEY_NAME
返回值:当key不存在时,返回-2,当key存在,但是没有剩余生存时间时,返回-1,否则,以秒为单位,返回key的剩余时间。
实例:
1 127.0.0.1:6379[1]> ttl name #没有key时,查看剩余时间,返回-2 2 (integer) -2 3 127.0.0.1:6379[1]> set name "Hello World" 4 OK 5 127.0.0.1:6379[1]> ttl name#key存在,但是没有过期时间,返回-1 6 (integer) -1 7 127.0.0.1:6379[1]> expire name 20#设置key剩余时间 8 (integer) 1 9 127.0.0.1:6379[1]> ttl name #查看key并返回剩余时间 10 (integer) 14 11 127.0.0.1:6379[1]> ttl name #剩余时间已过,key已被删除,返回-2 12 (integer) -2 13 127.0.0.1:6379[1]> get name #查看key是否存在,发现key已经被移除了 14 (nil)
RANDOMKEY命令
基本语法:RANDOMKEY
返回值:当数据库不为空时,返回一个key,当数据库为空时,返回nil。
实例1:
1 127.0.0.1:6379> mset fruit "apple" drink "beer" food "cookies" 2 OK #mset同时设置一个或多个key—value值 3 127.0.0.1:6379> randomkey #随机取出一个键值,并不删除 4 "drink" 5 127.0.0.1:6379> randomkey 6 "fruit" 7 127.0.0.1:6379> keys * #查看所有的键值 8 1) "food" 9 2) "fruit" 10 3) "drink" 11 #数据库为空 12 127.0.0.1:6379> flushdb #删除当前数据库所有key 13 OK 14 127.0.0.1:6379> randomkey #随机取出,查看结果取出为空,证明所有的key已经被删除 15 (nil)
redis Rename命令
rename命令用于修改key的名称。
基本语法如下:RENAME OLD_KEY_NAME NEW_KEY_NAME
返回值:改名成功时提示OK,失败时候返回一个错误,当OLD_KEY_NAME 和NEW_KEY_NAME相同,或者OLD_KEY_NAME不存在时,
返回一个错误,当NEW_KEY_NAME时已经存在时,RENAME命令将覆盖旧值。
实例1:
127.0.0.1:6379> set message "Hello world" OK 127.0.0.1:6379> rename message greeting #给key重命名 OK 127.0.0.1:6379> keys * 1) "greeting" 127.0.0.1:6379> get greeting "Hello world" 127.0.0.1:6379> get message (nil) 127.0.0.1:6379> rename fake never_exists#为不存在的key重命名,则报错 (error) ERR no such key
实例2:当newkey已经存在时,那么要更改名字的key会改名为新key,已经存在的旧的new_key则会被覆盖掉。
1 1 127.0.0.1:6379> set pc "lenovo" 2 2 OK 3 3 127.0.0.1:6379> set preson "dell" 4 4 OK 5 5 127.0.0.1:6379> rename pc preson 6 6 OK 7 7 127.0.0.1:6379> get pc #pc键值已经不存在 8 8 (nil) 9 9 127.0.0.1:6379> get preson #旧的person被覆盖掉 10 10 "lenovo"
RENAMENX key newkey命令
作用:该命令用于在新的key不存在时修改key的名称。如果新的key已经存在,那么则修改失败
基本语法: RENAMENX OLD_KEY_NAME NEW_KEY_NAME
返回值:修改成功时,返回1,如果new_key_name已经存在,返回0.
实例:newkey不存在,改名成功
127.0.0.1:6379> set player "KOF" OK 127.0.0.1:6379> exists best #键best不存在 (integer) 0 127.0.0.1:6379> renamenx player best #更名成功 (integer) 1 127.0.0.1:6379> exists player (integer) 0 127.0.0.1:6379> exists best (integer) 1
实例:newkey存在,更名失败
1 127.0.0.1:6379> get best 2 "KOF" 3 127.0.0.1:6379> set player "Hello" 4 OK 5 127.0.0.1:6379> reanmenx best player #更名为已经存在的newkey则报错 6 (error) ERR unknown command 'reanmenx' 7 127.0.0.1:6379> renamenx best player 8 (integer) 0 9 127.0.0.1:6379> keys * 10 1) "best" 11 2) "player"
type命令
作用:该命令用于返回key所储存的值的类型。
基本语法:TYPE KEY_NAME
返回值:返回key的数据类型,类型有:
none(key不存在)
string(字符串)
list(列表)
set(集合)
zset(有序集合)
hash(哈希表)
1 127.0.0.1:6379> set weater "sunny" #字符串 2 OK 3 127.0.0.1:6379> type weater 4 string 5 127.0.0.1:6379> lpush bool "Hello" #列表 6 (integer) 1 7 127.0.0.1:6379> type bool 8 list 9 127.0.0.1:6379> sadd pat "dog" #集合 10 (integer) 1 11 127.0.0.1:6379> type pat 12 set
Redis安装:
Redis是C语言编写的,安装在linux上,需要先安装gcc-c++进行编译。
1、tar zxf redis-3.0.7.tar.gz
2、cd redis-3.0.7
3、make #编译
4、安装:
make PREFIX=/usr/local/redis install
5、后台启动:
(1)首先修改redis配置文件
daemonize no 改为
daemonize yes
(2)启动
./bin/redis-server ./redis.conf
redis扩展
1、解压压缩包
unzip phpredis-master.zip
2、进入解压出来的包
cd phpredis-master
(找到PHP安装目录中的phpize进行扩展)
/home/php/bin/phpize
./configure --with-php-config=/home/php/bin/php-config
make
make install (安装之后会返回目录)
把目录加入到PHP的安装目录中的php.ini中:
extension_dir = ''
extension = redis.so
3、重启PHP
service php-fpm restart
重启nginx
4、浏览器中访问192.168.1.251:/info.php
这样PHP成功扩展redis
redis 主从配置
拷贝已经安装的redis的配置文件
cp redis.conf redis_6380.conf
cp redis.conf redis_6381.conf
进入redis_6380.conf修改:
daemonize yes
port 6380
pidfile /var/run/redis_6380.pid
slaveof 127.0.0.1(主ip) 6379(主端口)
进入redis_6381.conf修改:
daemonize yes
port 6381
pidfile /var/run/redis_6381.pid
slaveof 127.0.0.1(主ip) 6379(主端口)
启动redis主、从即可
./bin/redis-server ./redis_6380.conf
./bin/redis-server ./redis_6381.conf
这时在redis主库写入数据,那么从库也会同步过来了
主库:
[root@bogon redis]# ./bin/redis-cli
从库(1):
从库(2):
到此一台服务器配置多个redis实例并且完成redis主从配置
redis-3.0.7 主从高可用 详细配置
部署规划:
192.168.1.246 主节点
192.168.1.245 从节点
主机节点:
主节点redis.conf配置
daemonize yes #让redis后台运行 pidfile /apps/run/redis/redis.pid #指定redis的pid文件存放位置 port 6379 #redis使用端口 logfile "/apps/logs/redis/redis.log" #log文件的位置。如果为空,则默认打印到/dev/null requirepass 123456 #redis的密码,如果不需要密码验证,则可以不做修改 masterauth 123456 #如果上面设置了redis的密码,则这里必须设置,而且要和他一样。当该节点作为从节点连接主节点时,要用到这个密码和主节点做校验。
启动redis:
./bin/redis-server ./redis.conf
查看当前主从状态
./bin/redis-cli -h 192.168.1.246 -p 6379 -a 123456
role:master
可以看到,192.168.1.246为主,当前的192.168.1.245为slave(因为已经做好了所以显示192.168.1.245为slave,如刚开始做则connected_slaves为0)
接下来就是配置sentinel.conf了(把sentinel.conf从源文件中,拷贝到redis安装目录下边,并进行如下配置):
要修改的就是上面几项,一定要特别注意sentinel auth-pass这一项,别忘记改,修改好后,先拷贝一个备份
启动sentinel
./bin/redis-sentinel sentinel.conf
查看sentinel日志:
第一个表示当前的sentinel 的ID,第二行显示当前的主节点是192.168.1.246
查看sentinel的状态:
./bin/redis-cli -h 192.168.1.246 -a 12345 -p 26379
从节点
redis.conf的配置与主节点只有一点不同,增加下面一行:
slaveof 192.168.1.246 6379
启动redis
./bin/redis-server redis.conf
在从节点上查看主从状态:
可以看到当前节点为slave。
sentinel的配置和主节点保持一致就可以,启动sentinel:
./bin/redis-sentine sentinel.conf
查看sentinel log:
查看下sentinel状态:
可以看出,当前有两个sentinels,一个为slave。
到此,redis主从高可用就算配置结束了,验证就不写啦,下班喽
jedis 入门
jedis就是连接redis的基本操作
jedis 是redis官方首选的Java客户端开发包
127.0.0.1:6379[1]> ttl name
(integer) -2
127.0.0.1:6379[1]> set name "Hello World"
OK
127.0.0.1:6379[1]> ttl name
(integer) -1
127.0.0.1:6379[1]> expire name 20
(integer) 1
127.0.0.1:6379[1]> ttl name
(integer) 14
127.0.0.1:6379[1]> ttl name
(integer) -2
127.0.0.1:6379[1]> get name
(nil)