NoSQL
NoSQL(Not Only Sql),是一项全新的数据库理念,和我们学
过的MySQL和Orcal等这类的关系型数据库相对映,泛指非
关系型数据库
NoSQL优势
在目前的互联网项目中,经常面临的3个问题
1.高并发
2.高负载
3.高可用
高并发
在同一个时间内应用服务器会收到大量的请求,同样
这些请求也要去操作我们的数据库服务器,每次读写操作就
要发生磁盘的IO,对于关系型数据库而言,已经无法无法承受
了
高负载
因为有大量的用户访问门户网站,每个用户访问的以
及点击都会产生各种数据,对于数据库而言需要保存大量的
数据,那么在关系型数据库中在一张有几亿条记录的表中进
行sql查询,效率是及其低的
高可用
随着与日俱增的访问量和用户量,当数据库已经达到
上线的时候,就需要进行相应的扩展,对于关系型数据库而言,
在进行数据的扩展和迁移的时候,往往需要停机维护
NoSQL数据库的产生,就是为了解决上述难题
主流产品
Redis
HBase
MongoDB
Riak
CouchDB
membase
NoSQL特点
NoSQL虽说种类繁多,但都具有如下特性,易扩展,高性能,高可用,灵活性数据模型
Redis
Redis是用c语言开发的一个开源的键值对数据库,官方提供
的数据,对于50个并发,执行10万次请求,读的速度是110000
次/s,写的速度的是81000次/s,它通过提供了多种键值类型
满足多样化的需求,对于redis而言键的类型一般都为字符
串,对应的值有5中类型
1.字符串类型(String)
2.散列类型(hash)
3.列表类型(list)
4.集合类型(set)
5.有序集合类型(sorted set)
Redis是一个开源(BSD许可)的内存数据结构存储,用作数据库,缓存和消息代理。
简单来说,它是一个以(key,value)的形式存储数据的数据库.
官网:https://redis.io/download 去下载对应的版本
命令网站
http://redisdoc.com
使用场景
缓存(数据查询,新闻,商品信息)(使用最多)
任务队列(秒杀,抢购,邮件验证,短信验证)
分布式集群的 session 的分离
安装环境
官方推荐的是在Linux下进行安装的,同样也有windows下
的安装版,只不过window下的版本不是官方版本,安装
windows版本,解压双击redis-server.exe即可,推荐在linux
下进行安装,以下内容就是在linux中redis
因为Redis是c语言开发的,所以需要c语言的编译环境,先编
译后再安装
启动后默认端口号 6379
yum install gcc-c++
yum install epel-release --下载fedora的epel仓库
安装
yum install redis -- 安装redis数据库
启动
service redis start
service redis stop
redis-cli -- 进入redis服务
查看
ps -ef | grep redis
命令
清空所有数据 flushall
del key1 key2 删除key
exists key 1代表存在,0代表不存在
rename key newName 给当前key重命名
expire key 时间 设置key的过期时间,单位为秒
ttl key 获取key,所剩余的超时时间,如果没有设置超时返
回1,如果返回2表示超时不存在
type key 获取key的指定类型,返回为string list set hash 和zset
http://doc.redisfans.com/
String
字符串类型是Redis中最为基础的数据存储类型,它在
Redis中是二进制安全的,这 便意味着该类型可以接受任
何格式的数据,如JPEG图像数据或Json对象描述信息
等。 在Redis中字符串类型的Value最多可以容纳的数据长
度是512M
设置键值对 set key value
设置多个键值对 mset key1 value1 age 125
通过指定键获取值 get key
如果key不存在返回的值为 nil
删除key del key
先获取该key的值,然后在设置该key的值. getset key
value
incr key 增加键对应的值让值+1,如果键不存在自动创建
一个,默认是0,并加1
decr key 减少键对应的值让值-1
incrby key increment 相当于 i+=increment
decrby key decrement 相当于 i-=decrement
append key value 如果该key存在,则在原有的value后追
加该值;key不存在,则重新创建一个key/value
SET KEY VALUE [EX seconds] [PX milliseconds] [NX|XX]
EX seconds − 设置指定的到期时间(以秒为单位)。PX milliseconds - 设置指定的到期时间(以毫秒为单位)。NX - 仅在键不存在时设置键。XX - 只有在键已存在时才设置。
SET mykey "redis" EX 60 NX
hash类型
Redis中的Hashes类型可以看成具有String Key和String
Value的map容器。所 以该类型非常适合于存储值对象的
信息。如Username、Password和Age等。如果 Hash中包
含很少的字段,那么该类型的数据也将仅占用很少的磁盘
空间。每一个Hash可以存储4294967295个键值对。
赋值
hset key field1 value1 为指定的key设定
field/value对(键值对)设置一个
hmset key field1 value1 field2 value2 :为指定
的key设定field/value对(键值对)设置多个
取值
hget key field :返回指定的key中的field的值
hmget key field1 field2 field3 :返回指定的key
中的field的值,返回多个
hgetall key :获取key中的所有filed-vaule
删除
hdel key filed1 filed2 ,删除多个
del key 删除整个key对应的内容
增加
hincrby key field increment 设置key中filed的值
增加increment,如:age增加20
hexists key field 判断指定的key中的filed是否存在
hlen key 获取key所包含的field的数量
hkeys key 获得所有的key
hvals key 获得所有的value
list类型
在Redis中,List类型是按照插入顺序排序的字符串链表。
和数据结构中的普通链表 一样,我们可以在其头部(left)和
尾部(right)添加新的元素。在插入时,如果该键并不 存
在,Redis将为该键创建一个新的链表。与此相反,如果
链表中所有的元素均被移 除,那么该键也将会被从数据库
中删除。List中可以包含的最大元素数量是 4294967295.
从元素插入和删除的效率视角来看,如果我们是在链表的
两头插入或删除元素,这将会是非常高效的操作,即使链
表中已经存储了百万条记录,该操作也可以在常量时间内
完成。然而需要说明的是,如果元素插入或删除操作是作
用于链表中间,那将会是 非常低效的
两端添加
lpush key value1 value2... 在指定的key所关联的
list的头部插入所有的 values,如果该key不存在,该命
令在插入的之前创建一个与该key关联的空链 表,之后
再向该链表的头部插入数据。插入成功,返回元素的个
数。
rpush key value1、value2… 在该list的尾部添加元素
lpushx key value 仅当参数中指定的key存在时(如
果与key管理的list中没 有值时,则该key是不存在的)
在指定的key所关联的list的头部插入value。
rpushx key value 在该list的尾部添加元素
查看列表
lrange key start end 获取链表中从start到end的元
素的值,start、end可 为负数,若为-1则表示链表尾部
的元素,-2则表示倒数第二个,依次类推…
两端弹出
lpop key 返回并弹出指定的key关联的链表中的第一
个元素,即头部元素。
rpop key 从尾部弹出元素
llen key 返回指定的key关联的链表中的元素的数量。
linsert key before|after pivot value 在pivot元素前
或者后插入value这个 元素。如 linsert mylist before
2 zhangsan
Set
在Redis中,我们可以将Set类型看作为没有排序的字符集
合,和List类型一样,我 们也可以在该类型的数据值上执
行添加、删除或判断某一元素是否存在等操作。需要 说明
的是,这些操作的时间是常量时间。Set可包含的最大元
素数是4294967295.和List类型不同的是,Set集合中不允
许出现重复的元素。和List类型相比,Set类 型在功能上还
存在着一个非常重要的特性,即在服务器端完成多个Sets
之间的聚合计 算操作,如unions、intersections和
differences。由于这些操作均在服务端完成, 因此效率极
高,而且也节省了大量的网络IO开销
sadd key value1、value2… 向set中添加数据,如果该
key的值已有则不会 重复添加
smembers key 获取set中所有的成员
srem key member1、member2… 删除set中指定的成员
sismember key member 判断参数中指定的成员是否在该
set中,1表示存 在,0表示不存在或者该key本身就不存在
scard key 获取set中成员的数量
srandmember key 随机返回set中的一个成员
集合相关
sdiff key1 key2 返回key1与key2中相差的成员,而
且与key的顺序有 关。即返回差集。如 sdiff key1
key2 表示key1中哪些元素不在key2中
sdiffstore destination key1 key2 将key1、key2
相差的成员存储在 destination上
sinter key1 key2 返回交集。
sinterstore destination key1 key2 将返回的交
集存储在destination上
sunion key1、key2 返回并集。
sunionstore destination key1 key2 将返回的并
集存储在destination上
sortedset类型
SortedSets和Sets类型极为相似,它们都是字符串的集
合,都不允许重复的成员出 现在一个Set中。它们之间的
主要差别是SortedSets中的每一个成员都会有一个分 数
(score)与之关联,Redis正是通过分数来为集合中的成员
进行从小到大的排序。然 而需要额外指出的是,尽管
SortedSets中的成员必须是唯一的,但是分数(score) 却
是可以重复的。在SortedSet中添加、删除或更新一个成
员都是非常快速的操作,其时间复杂度为 集合中成员数量
的对数。由于SortedSets中的成员在集合中的位置是有序
的,因此即便是访问位于集合中部的成员也仍然是非常高
效的。
zadd key score1 member1 score2 member2 … 将所有
成员以及该成员的分数存放到sortedset中
zscore key member 返回指定成员的分数
zcard key 获取集合中的成员数量
zrem key member[member…] 移除集合中指定的成员,可
以指定多个成员。
zrange key start end [withscores] 获取集合中脚标
为startend的成员,[withscores]参数表明返回的成员包含
其分数。
zrevrange key start end [withscores] 按照分数从大
到小的顺序返回索引从startend的元素,[withscores]参数表
明返回的成员包含其分数。
删除元素
zremrangebyrank key start end 按照排名顺序删除
从后向前的元素
zremrangebyscore key min max 按照分数从小到达
删除
zrangebyscore key min max [withscores] [limit
offset count] 返回分数在[min,max]的成员并按照分数从
低到高排序。[withscores]:显示分数;[limit offset
count]:offset,表明从脚标为offset的元素开始并返回
count个成,例如 zrangebyscore mysort 60 100
withscores limit 0 2
zcount key min max 获取分数在[min,max]之间的成员个
数
zincrby key increment member 设置指定成员的增加的
分数
zrank key member 返回成员在集合中排名,从小到大排序,
索引从0开始
Jedis
java连接redis
Redis不仅是使用命令操作,现在基本上主流的语言都有客
户端的支持,有很多java客户端,有Jedis,Redisson,Jredis等,
目前企业中用的比较多的就是Jedis
创建工程导入jar
commons-pool2-2.3.jar
jedis-2.7.0.jar
链接Jedis
https://blog.csdn.net/ticktak/article/details/82262946
创建Jedis对象,通过构造方法,指定服务器的ip地址和端口号
Jedis jedis = new Jedis("192.168.80.130",6379);
此处如果出现了连接超时,说明redis的端口没有对
外开发,需要在linux中开放6379端口
获取redis中的数据 String name = jedis.get("name");
向redis中添加键值对 jedis.set("pwd"
,
"123");
关闭连接 jedis.close();
Jedis jedis = new Jedis("192.168.80.130"
, 63
79);
String name = jedis.get("name");
System.out.println(name);
jedis.set("pwd"
,
"123");
System.out.println(jedis.get("pwd"));
jedis.close();
Jedis无法链接
关闭防火墙
redis默认绑定 IP
# bind 127.0.0.1 ::1
设置密码
设置密码
初始化Redis密码:
在配置文件中有个参数: requirepass 这个就是配置redis访问密码的参数;
比如 requirepass test123;
登录密码
先登录后验证
auth test123
登录时验证
redis-cli -p 6379 -a test123
单点登录SSO
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。
SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
登录功能
pom.xml
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>1.3.1.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.1</version>
</dependency>
web.xml
<filter>
<filter-name>springSessionRepositoryFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSessionRepositoryFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
springmvc.xml
<bean id="redisHttpSessionConfiguration"
class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
<property name="maxInactiveIntervalInSeconds" value="600" />
</bean>
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="100" />
<property name="maxIdle" value="10" />
</bean>
<bean id="jedisConnectionFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
destroy-method="destroy">
<property name="hostName" value="192.168.0.241" />
<property name="password" value="123456" />
<property name="port" value="6379" />
<property name="timeout" value="3000" />
<property name="usePool" value="true" />
<property name="poolConfig" ref="jedisPoolConfig" />
</bean>
Redis 的RDB和AOF
https://www.cnblogs.com/itdragon/p/7906481.html
Redis 对象存储
https://www.cnblogs.com/rocky-AGE-24/p/7152613.html