NoSQL
什么是NoSQL
NoSQL(NoSQL=Not only SQL),直译为“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库
出现背景
传统的关系数据库在应付新的网站时,特别是超大规模和高并发的sns类型的web2.0纯动态网站时已经显得力不从心。出现了很多的问题,例如:
对数据库高并发读写的需求
对海量数据的高效率存储和访问的需求
对数据库的高可扩展性和高可用性的需求
主流NoSQL产品
图片.png
NoSQL数据库的分类
图片.png
图片.png
图片.png
Redis简介
Redis是用C语言开发的一个开源的高性能键值对数据库,通过提供多种键值数据类型来适应不同场景下的存储需求。目前Redis支持的键值数据类型如下
字符串类型
散列类型
列表类型
集合类型
有序集合类型
图片.png
关于关系型数据库和nosql数据库
关系型数据库是基于关系表的数据库,最终会将数据持久化到磁盘上,而nosql数据 库是基于特殊的结构,并将数据存储到内存的数据库。从性能上而言,nosql数据库 要优于关系型数据库,从安全性上而言关系型数据库要优于nosql数据库,所以在实 际开发中一个项目中nosql和关系型数据库会一起使用,达到性能和安全性的双保证。
安装Redis数据库(Linux)
安装redis编译环境c环境
yum install gcc-c++
上传redis__.tar.gz 上传到服务器中
解压到/usr/local下
tar -xvf file -c /usr/local
进入redis目录,使用make编译redis
在redis目录中,使用
make PREFIX=/usr/local/redis install命令安装redis到/usr/local/redis中
拷贝redis中的redis.conf到安装目录中
启动redis目录下的bin下执行命令:
redis-server redis.conf
如果需要远程连接redis,需要配置redis端口6379,在linux防火墙中添加允许规则
# centos 6.5
/sbin/iptables -I INPUT -p tcp --dport 6379 -j ACCEPT
/etc/rc.d/init.d/iptables save
# centos 7
firewall-cmd --zone=public --add-port=6379/tcp --permanent
启动redis
在redis bin下
./redis-server
启动后看到如下界面代表启动成功
图片.png
redis目录结构及功能
图片.png
启动redis客户端(前端启动)
redis客户端在安装目录下 bin/redis-cli 启动客户端
./redis-cli
存储数据
set username zhangsan
读取数据
get username
图片.png
redis后端启动
操作 redis安装目录下 redis.conf
拷贝redis.conf 到安装目录
编辑redis.conf
vim redis.conf
添加daemonize yes 后端启动
图片.png
指定启动文件 启动redis
图片.png
关闭后端启动的redis
图片.png
客户端关闭服务器
图片.png
连接redis客户端
redis-cli -h ip地址 -p端口
向redis发送命令
图片.png
使用JAVA来操作Redis -----Jedis
导入Jar包
图片.png
单实例连接
//获得连接对象
Jedis jedis = new Jedis("103.249.130.171", 6379);
String username = jedis.get("username");
System.out.println(username);
//存储数据
jedis.set("addr", "beijing");
//取出存储的数据
System.out.println(jedis.get("addr"));
//释放资源
jedis.close();
连接池连接
//创建连接池配置对象
JedisPoolConfig poolConfig = new JedisPoolConfig();
//设置最大闲置个数
poolConfig.setMaxIdle(30);
//设置最小闲置个数
poolConfig.setMinIdle(10);
//设置最大连接数
poolConfig.setMaxTotal(50);
//创建redis连接池
JedisPool pool = new JedisPool(poolConfig, "103.249.130.171", 6379);
//从连接池中获取redis的连接资源
Jedis jedis = pool.getResource();
//存储数据
jedis.set("age", "22");
//存取数据
System.out.println(jedis.get("age"));
//释放资源
jedis.close();
Redis的数据结构
图片.png
存储String
概述
字符串类型是redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型存入和获取的数据相同,在Redis中字符串类型的Value最多可以容纳的数据长度是512M
赋值
set key value 设定key持有特定的字符串value,如果该key存在则进行覆盖操作
图片.png
取值
get key:获取key的value。如果该key关联的value不是String类型,Redis将返回错误信息。因为get命令只能用于获取String Value 如果该key不存在,返回null
图片.png
getset key value 先获取该key的值,然后再设置该key的值
图片.png
删除
使用 del key来删除 key对应的value值
图片.png
数值增减
incr key 将指定的key的value原子性的递增1,如果该key不存在,其初始值为0.在incr之后,初始值为1.如果value的值不能转成整型。该操作将执行失败并返回相应的错误信息
图片.png
decr key 将指定的key的value原子性的递减1,如果key不存在,其初始值为0,在incr之后值为-1,如果value的值不能转成整型,则操作将执行失败并返回相应的错误信息
扩展命令
incrby key increment:将指定的key的value原子性增加increment,如果该key不存在,初始值为0 在incrby之后,该值为increment,如果该值不能转成整型,则失败并返回错误
图片.png
decrby key decrement:将指定的key的value原子性减少decrement 如果该key不存在,初始值为0 在decry之后,该值为increment,如果该值不能转成整型。则失败并返回错误信息
图片.png
append key value:拼凑字符串,如果该key存在,则在原有的value后追加该值;如果该key不存在,则重新创建一个key/value,每次执行返回字符串的长度
图片.png
存储hash
Redis中的Hash类型可以看成具有String key和String value的map容器。所以该类型非常适合于存储值对象的信息。如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储4294967295个键值对
图片.png
常用命令
赋值
hset key field value 为指定的key设定field/value对
图片.png
hmset key field value [field2 value2 ...] 设置key中的多个filed/value对
图片.png
取值
hget key filed 返回指定key中的filed的值
图片.png
hmget key fileds 获取key中的多个filed的值
图片.png
hgetall key:获取key中所有的filed-value
图片.png
删除
hdel key field[field...] 可以删除一个或多个字段,返回值是被删除的字段个数
图片.png
del key 删除整个的list
图片.png
增加数字
hincrby key field increment 设置key中filed的值增加increment
图片.png
图片.png
存储List
图片.png
图片.png
图片.png
图片.png
常用命令
两端添加
lpush key values[value1,value2...]在指定的key所关联的List的头部插入所有的values(注意是头部)如果该key不存在,该命令在插入之前创建一个与该key关联的空链表。之后再向该链表的头部插入数据。插入成功后,返回元素的个数
图片.png
rpush key values[value1、value2...] 在该list的尾部添加元素
图片.png
lpushx key value:仅当参数中指定的key存在时,向关联的list的头部插入value,如果不存在将不进行插入
图片.png
rpushx key value:在该list的尾部添加元素
图片.png
查看列表
lrange key start end:获取链表中从start到end元素的值。start、end从0开始计数:也可为负数,若为-1表示链表尾部的元素。-2表示倒数第二个
lrange list1 0 7 等同于 lrange list 0 -1
图片.png
两端弹出
lpop key:返回并弹出指定的key关联的链表中的第一个元素,即头部元素。如果该key不存在返回nil;若key存在,则返回链表的头部元素
图片.png
rpop key:从尾部弹出元素
图片.png
获取列表中元素的个数
llen key :返回指定的key关联的链表中的元素的数量
图片.png
lrem key count value 删除count个值为value的元素
图片.png
rpoplpush
图片.png
存储set
概述
图片.png
常用命令
存储和添加元素
sadd key values[value1,value2...]:向set中添加数据,如果key的值已经有则不会重复添加
图片.png
srem key members[member1、member2]:删除set中指定的member
图片.png
获得集合中的元素
smembers key:获取set中的所有成员
图片.png
sismember key member:判断参数中指定的成员是否在该set中,1表示存在 0表示不存在或key本身就不存在
图片.png
集合的差运算 A-B
sdiff key1 key2:返回key1 与 key2中相差的成员,与key的顺序有关,返回差集
图片.png
图片.png
集合的交集运算
sinter key1 key2 key3.... 返回交集
图片.png
图片.png
集合的并集运算
sunion key1 key2 key3 ....返回并集
图片.png
扩展命令
scard key 获取set中成员的数量
图片.png
srandmember key: 随机返回set中的一个成员
图片.png
sdiffstore destination key1,key2...将key1,key2相差的成员存储在destination上
图片.png
sinterstore destination key[key] 将返回的交集存储在destination上
图片.png
sunionstore destination key[key] 将返回的并集存储在destination上
图片.png
sortedset
概述
图片.png
常用命令
添加元素
zadd key score member score2 member2....:将所有成员以及该成员的分数存放到sortedset中,如果该元素已经存在则会用新的分数替换原有的分数,返回值是新加入到集合中元素的个数,不包含之前已经存在的元素
图片.png
获得元素
zscore key member 返回指定成员的分数
图片.png
zcard key 获取集合中的成员数量
图片.png
删除元素
zrem key member[member...] 移除集合中指定的成员,可以指定多个成员
图片.png
范围查询
zrange key start end [withscores] 获取集合中角标为start-end的成员,withscores参数表明返回的成员包含其分数
图片.png
zrevrange key start stop [withscores]:按照元素分数从大到小的顺序返回索引从start到stop之间的所有元素,包含两端的元素
图片.png
zremrangebyrank key start stop:按照排名范围删除元素
图片.png
其他命令
图片.png
keys的通用操作
keys pattern 获取所有与pattern匹配的key,返回所有与该key匹配的keys.*表示任意一个或多个字符,?表示任意一个字符
图片.png
del key1 key2...删除指定的key
exists key 判断该key是否存在 1存在 0不存在
图片.png
rename key newkey 为指定的key重命名为newkey
expire key 设置过期时间 单位:秒
ttl key:获取该key所剩的超时时间,如果没有设置 返回-1 如果返回-2表示超时 key已经不存在
type key 获取指定的key类型,该命令将以字符串的格式返回,返回的字符串为string list set hash zset 如果key不存在则返回none
Redis特性
Redis多数据库
概念
一个Redis实例可以包括多个数据库,客户端可以指定连接某个redis实例的哪个数据库,就好比一个mysql钟创建多个数据库,客户端连接时指定连接哪个数据库
一个redis实例最多可提供16个数据库,下标从0到15 客户端从默认连接第0号数据库,也可通过select选择连接哪个数据库
图片.png
newkey移植到1号库
图片.png
消息订阅与发布
图片.png
图片.png
图片.png
Redis事物
图片.png
命令
图片.png
图片.png
图片.png
图片.png
图片.png
Redis持久化
图片.png
图片.png
图片.png
图片.png
图片.png
图片.png
图片.png
图片.png
图片.png
图片.png