NoSql概述
介绍
- Not Only Sql
- 非关系型数据库
特点
- 易拓展
- 灵活的数据模型
- 大数据量,高性能
- 高可用
能解决那些问题
- High performance - 高并发读写
- Huge Storage - 海量数据的高效率存储和访问
- High Scalability & High Availability - 高可扩展性和高可用性
nosql主流产品
- mongoDB
- Redis
四大分类
- 键值对存储(key-vaule)
- 列存储
- 文档数据库
- 图形数据库
支持的键值数据类型
- 字符串类型
- 列表类型
- 有序集合类型
- 散列类型
- 集合类型
应用场景
- 缓存
- 任务队列
- 访问统计
- 过期数据处理
- 应用排行榜
- 分布式架构中的session分离
安装
- 环境建议安装在linux上 需要gcc
安装gcc命令yum install gcc-c++;提示是否下载的话输入 y - 把redis下载的压缩文件上传到linux上
解压 “tar -zxvf 压缩文件名”
进到解压后的目录 redis-3.0.7 - 然后执行make,
执行make之后安装make PREFIX=/usr/local/redis(指定安装的路径) insatll
进到安装路径 cd /usr/local/redis 在此目录下的bin目录下 redis-server就是启动命令 ./redis-server 前段启动需修改
原来的路径redis-3.0.7下找到redis.conf,复制到刚才安装的目录/usr/local/redis下,修改里面daemonize no 把no改为yes
然后在/usr/local/redis目录下执行 " ./bin/redis-server ./redis.conf " 默认端口6379 " ./bin/redis-cli shutdown " 来关闭
通过./bin/redis-cli连接进入服务
set key value 存入数据;
get key 获取数据
jedis入门
- 官网首选java客户端开发包,引入到对应的项目
- 6379端口开放 vim /etc/sysconfig/iptables ,增加如下一行
-A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT - 开发和使用基础方式
- 设置ip地址和端口
Jedis jedis = new Jedis(“ip”,“port”); - 保存数据
jedis.set(“key”,“value”); - 获取数据
jedis.get(“key”); - 释放资源
jedis.close();
- 开发和使用连接池方式
- 获得连接池的配置对象
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(30); // 设置最大连接数
config.setMaxIdle(10);// 设置最大的空闲连接数 - 获得连接池
JedisPool pool = new JedisPool (config,“ip”,port);
3.获得核心对象
Jedis jedis = null;
try{
jedis = pool .getResource();// 通过连接池获取连接
jedis.set(“key”,“value”);//存数据
jedis.get(“key”);//获取数据
}catch(Exception e){
e.print();
}finally{
//释放资源
if(jedis != null){
jedis.close();
}
if(pool != null){
pool .close();
}
}
数据结构,key不要太长
-
string :最常用,二进制方式存入,最大512M;常用命令1.赋值set,getset先获取再赋值;2.取值get;3.删除del;4.扩展命令;5.数值增减 incr递增1;decr递减;incrby 指定加n decrby指定减 ;append拼接字符串
-
hash :,可以看做是String做Key和Value的Map容器; 可以有子property嵌套结构,方便只召回部分property;常用命令:1.赋值:“hset hash(集合名) key value” ,hmset 例:hmset myhash2(集合名) username role age 21; 2.取值:“hget hash key”;hmget获取多个属性值;hgetall hash,可以获取到此对象的属性和值;3.删除,hdel 删除单个或多个属性“hdel myhash(集合名) key1 key2 ”;del删除整个集合;4.加和减, 加:hincrby hash key num表示key值加5;5.判断是否存在 hexists hash key;6.hlen hash获取属性数量;7.hkeys hash获得所有的key
-
list :按照插入顺序排序的链表,无内容时key也移除;
1.ArrayList使用数组方式
2.LinkedList使用双向链表的方式
3.双向链表中增加数据
4.双向链表中删除数据
list的常用命令:
1.两端添加"lpush mylist a b c" 表示从左侧把a b c三个元素添加到mylist表中;“rpush list 1 2 3 ”从右侧添加
2.查看列表:lrange list start end 可以0或负数;
3.两端弹出:lpop list 弹出第一个元素,空时返回nil,弹出之后值就清掉
4.获取列表元素个数:llen list
5.扩展命令:lpushx mylist 其中mylist存在时会在头部插入数据,不存在不执行;rpushx 同上在尾部执行;lrem mylist count value 表示从头开始往后删除count个value; count为负表示从后面开始往前删除;count为0表示删除所有的value;lset 根据脚标设置元素值如:lset mylist 2 a 表示把mylist的第三个元素的值设置为a;linsert mylist before value value1,表示在集合mylist中的value之前插入数据value1,after可在之后插入;rpoplpush mylist1 mylist2 表示把mylist1的位数弹出压入到mylist2的头部 -
set :和list的区别是不允许出现重复的元素;
set常用命令:
1.添加/删除元素 : "sadd myset a b"表示往myset中添加a和b;“srem myset a b"表示删除myset中的a和b元素;
2.获得集合中的元素:smembers myset查看myset的元素,sismember myset a查看myset中是否存在a
3.集合中的差集运算:sdiff myaset mybset查看myaset和mybset的差值与顺序有关
4.集合中的交集运算:sinter myaset mybset可以求得交集
5.集合中的并集运算:sunion myaset mybset可得到并集结果
6.扩展命令:scard myset可以得到myset的数量;srandmember 随机返回集合中的一个成员;sdiffstore把两个集合相差的存到另一个集合,如:sdiffstore myset myaset mybset表示把myaset和mybset的差值存到myset中;sinterstore及sunionstore类似sdiffstore -
sorted-set:有一个分值关联,按分值排序,在集合中的位置有序
常用命令:
1.添加元素:zadd mysort 70 zs 80 ls 表示添加zs和ls分值分别为70和80;zadd mysort 100 zs会替换原有的分数
2.获得元素:zscore mysort zs 表示获得zs的分值;zcard mysort可以得到成员的数量
3.删除元素:zrem mysort zs ls 删除zs和ls元素
4.范围查询:zrange mysort 0 -1 查询出来所有;后面可带withscores显示出分值从小打到排序的;zrevrange可从大到小排序;zremrangebyrank mysort 0 2 表示按照范围0到2进行删除;zremrangebyscore mysort 70 75 按照分值70到75之间的进行删除;zrangebyscore mysort 0 70 表示查询分值0到70的元素, 后面可带withscores显示出分值,可带limit 0 2只显示前两个
5.扩展命令:zincrby mysort 3 zs 给zs加3分;zcount mysort 80 90查看80到90分的数量 -
zset:类似java的treeSet实现使用跳表(跳过一定步长)加压缩表的方式,双向链表;
-
keys通用操作
1.keys * 查看所有的key
2.keys my? 查看以my开头的key
3.del my1 my2 删除my1和my2
4.exists my1 查看my1是否存在
5.get key获取key的内容
6.rename a1 b1把key a1改名成b1
7.expire mykey 1000 设置mykey的过期时间为1000秒,单位秒
8.ttl mykey查看mykey剩余的超时时间
9.type mykey 查看mykey的数据类型
redis特性
- 可连接16个数据库,默认连接下表最小的0 通过select n切换,n从0到15
- move myset 1表示移动myset这个key到1号数据库
- 支持事务操作multi开启 exec提交 discard回滚
数据持久化,可同时使用也可配置不持久化
- rdb:存取全量数据,备份和存储周期以另一个线程做驱动,默认方式
- aof:存取增量数据;到期写、到次数写
缓存淘汰策略
- lru:根据key最近最少使用的淘汰,往往作为默认
1.allkeys:所有
2.volatile:设置过期时间的 - ttl:从已设置过期时间中挑选将要过期的淘汰
- random:数据中随机淘汰
1.allkeys:所有
2.volatile:设置过期时间的 - no-enviction:禁止驱逐,直接报错;一般用于保证数据不能丢失的场景
单线程及原子性
- setnx:设置一个值返回true,如果值已存在返回false不会修改已存在的值,单线程处理,可以保证原子性,work Thread为内存级别的执行,避免cpu切换一般把对应的work Thread绑定在固定的cpu执行