NOSQL
- 介绍:NoSQL(Not Only Sql),是一项全新的数据库理念,泛指非关系型数据库
- 优势:NoSQL数据库的产生,就是为了解决,高并发高负载高可用
- 高并发,在同一个时间内应用服务器会收到大量的请求,同样这些请求也要去操作我们的数据库服务器,每次读写操作就 要发生磁盘的IO,对于关系型数据库而言,已经无法无法承受了
- 高负载,因为有大量的用户访问门户网站,每个用户访问的以及点击都会产生各种数据,对于数据库而言需要保存大量的数据,那么在关系型数据库中在一张有几亿条记录的表中进 行sql查询,效率是及其低的
- 高可用,随着与日俱增的访问量和用户量,当数据库已经达到上线的时候,就需要进行相应的扩展,对于关系型数据库而言,在进行数据的扩展和迁移的时候,往往需要停机维护
-
redis
介绍
介绍:Redis是用c语言开发的一个开源的键值对数据库,对于redis而言键的类型一般都为字符串,对应的值有5中类型
- 字符串类型(String)
- 散列类型(hash)
- 列表类型(list)
- 集合类型(set)
- 有序集合类型(sorted set)
使用场景
创建目录:
redis /usr/local/redis- 下载redis安装包:
wgethttp://download.redis.io/releases/redis-5.0.3.tar.gz - 解压:
tar -zxvf redis-5.0.3.tar.gz - 进入安装目录,对redis进行编译:
make - 进入src目录中,进行安装:
make install 为了方便管理,给常用的几个模块创建快捷连接
前端启动(直接启动):
./redis-server- 端口号为6379
- 页面不能关闭
- 后端启动(配置启动):
- 修改配置文件 redis.conf
- 69行 注释该行 #bind127.0.0.1
- 88行 yes改为no
- 136行 no改为yes
- 启动redis:
./redis-server redis.conf - 查看进程:
ps -ef |grep redis是否启动成功 - 使用
./redis-cli验证是否连接成功,出现ip后 - 测试连接:输入ping确认后,会跳出pong
- 关闭redis服务
- 第一种
ps -ef |grep redis查看pid值kill -9 pid
- 第二种
./redis-cli shutdown
- 第一种
- 修改配置文件 redis.conf
使用redis
- 解决中文乱码问题,使用
./redis-cli --raw的方式来启动redis - 一共默认有 16 个库,选择库的命令是 select 0-15 ,默认是 0 号库
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
hash类型
Redis中的Hashes类型可以看成具有String Key和String Value的map容器。所以该类型非常适合于存储值对象的信息。如果 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中的所有filedvaule
- 删除
- hdel key filed1 filed2 ,删除多个
- del key 删除整个key对应的内容
- 增加
- hincrby key field increment 设置key中filed的值增加increment
- hexists key field 判断指定的key中的filed是否存在
- hlen key 获取key所包含的field的数量
- hkeys key 获得所有的filed
-
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的尾部添加元素
- lpush key value1 value2…
- 查看列表
- 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类型看作为没有排序且不可重复的字符集合,Set可包含的最大元 素数是4294967295. 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中的成员在集合中的位置是有序的,因此即便是访问位于集合中部的成员也仍然是非常高效的。
- sdiff key1 key2 返回key1与key2中相差的成员,而且与key的顺序有关。即返回差集。
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
- 开发步骤
- 添加maven依赖:
redis.clients - jedis - 3.0.1 - 测试是否连接成功
Jedis jedis = new Jedis("IP地址",6379);System.out.println(jedis.ping());//打印出pong就说明连接成功
- 添加maven依赖:
