一.NoSql概述 Not Only SQL
High performance高并发读写 传统关系型数据库很难应付
Huge Sorage 海量数据的高效率存储和访问
高可扩展性和高可用性
1.1 四大分类
键值存储 Redis 快速查询,但是数据缺少结构化
列存储 HBase 查找速度快,扩展强,功能相对局限
文档数据 MongoDB
图形数据库
1.2 NoSql的特点
易扩展
灵活的数据模型
高读写性能
二.Redis概述
C语言开发的高性能键值对数据库
支持类型
字符串 散列 列表 有序集合 集合类型
2.1 应用场景
缓存
任务队列
网站访问统计
数据过期处理
应用排行榜
分布式集群架构中的session分离
2.2 Redis的安装
首先安装GCC
如果不指定版本安装,可以yum install redis即可,自动安装
如果需要安装指定版本,需要编译
启动 ./bin/redis-server ./redis.conf
service redis start
关闭 kill -9 redis主进程号 不建议使用
service redis stop
启动客户端
redis-cli
简单使用
输入 ping 返回pong
set name abc 存入name 值为abc
get name 获取name的值
del name 删除name
keys * 查询所有的key
2.3 Jedis入门
是redis官方首选的java客户端开发包 github上可以找到
引入项目
commons-pool
jedis
redis.clients
jedis
2.9.0
jar
compile
测试示例
//1.设置ip地址和端口
Jedis jedis = new Jedis("192.168.1.66",6379);
//2.保存数据
jedis.set("name","linc");
//3.获取数据
String value=jedis.get("name");
//4.释放资源
jedis.close();
连接池方式
//获取连接池的配置对象
JedisPoolConfig config=new JedisPoolConfig();
//设置最大连接数
config.setMaxTotal(30);
//获取连接池
JedisPool jedisPool=new JedisPool(config,"192.168.1.66",6379);
//获得核心对象
Jedis jedis=null;
try{
//通过连接池获得连接
jedis=jedisPool.getResource();
//设置数据
jedis.set("name","张三");
String value=jedis.get("name");
}catch(Exception e){
e.printStackTrace();
}finally{
//释放资源
if(jedis!=null){
jedis.close();
}
if(jedisPool!=null){
jedisPool.close();
}
}
三.Redis的数据结构
五种数据类型
字符串 String
字符串列表 list
哈希 hash
字符串集合 set
有序字符串集合 sorted set
Key定义的注意点
不要过长,也不要过短
统一的命名规范
3.1 存储String
常用命令
赋值 set name linc
改值 getset name zhangsan
取值 get name
删除 del name
扩展命令
数值增减
incr num
get num 数值为1
incr num
get num 数值为2
decr num2 数值为-1
incrby num 6 指定给num增6
decrby num 3 指定给num减3
append num 5 在3的后面追加5这个字符串
3.2 存储Hash
String Key 和String Value的容器
每一个Hash可以存储4294967295个键值对
赋值 hset myhash username jack
hset myhash age 18
hmset myhash2 username rose age 21
取值 hget myhash name
hmget myhash2 username age
hgetall myhash
删除 hdel myhash2 username age
del myhash2 全部删除
增加数字 hincrby myhash age 5
自学命令 hexists myhash username 判断是否存在
hlen myhash 查找一个hash中的属性数量
hkeys myhash 获取所有的key
hvals myhash 获取所有的value
3.3 List
按照插入顺序排序的
ArrayList使用数组方式 查询快 增删慢
LinkedList使用双向链接方式
双向链表中增加数据
双向链表中删除数据
存储list常用命令
两端添加 lpush mylist a b c 将abc从左边放入链表中
rpush mylist2 c d e 将cde从右边放入链表中
查看列表 lrange mylist 0 5 查询从0到5个位置的元素
lrange mylist 0 -1 查询从0到最后一个位置的元素
两端弹出 lpop mylist 从左边弹出
rpop mylist 从右边弹出
获取列表元素个数 llen mylist
扩展命令 lpushx mylist 如果存在mylist则在左边头部插入一个值,如果不存在就不会插入
rpushx mylist 跟lpushx差不多,只是插入是从右边头部插入
lrem mylist3 2 3 在mylist3中从头到尾删除两个3
lrem mylist3 -2 1 从后面往前面删除两个1
lrem mylist3 0 2 删除里面的所有2
lset mylist3 3 mmm 在第三个角标插入mmm
linsert mylist4 before b 11 在b这个元素前插入11
linsert mylist4 after b 11 在b这个元素后面插入11
rpoplpush mylist5 mylist6将mylist5链表尾部的元素弹出并添加到mylist6头部
rpoplpush使用场景
上图
3.4 存储Set
Set不允许出现重复元素的
添加 sadd myset a b c
删除元素 srem myset a b
获得集合中的元素 smembers myset
sismember myset a 判断a是否在myset中
集合中的差集运算 sdiff mya1 mya2 判断差集
集合中的交集运算 sinter mya1 mya2 求交集
并集 sunion mya1 mya2
得到set具体的元素数量 scard myset
随机得到set中的某一个元素 srandmember myset
sdiffstore my1 mya1 mya2 将mya1与mya2相差的值存到my1中
sinterstore my2 mya1 mya2 将mya1与mya2的交集存在my2中
sunionstore my3 mya1 mya2 将mya1与mya2的并集存在my3中
存储set使用场景
跟踪一些唯一性数据
用于维护数据对象之间的关联关系
3.5 存储Storted-Set
Storted-Set和Set的区别
Storted-Set中的成员在集合中的位置是有序的
常用命令
添加元素 zadd 70 zs 80 ls 90 ww
zadd 100 zs 这里会用新的分数替换原有的分数 这里不显示zs
获取元素 zscore mysort zs 获得zs的分数
zcard mysort 获得具体成员的数量
zrange mysort 0 -1 范围查找查看所有元素的key
zrange mysort 0 -1 withscores 范围查找查看所有元素的key和score
zrangebyscore 0 100
zrangebyscore 0 100 withscores
zrangebyscore 0 100 withscores limit 0 2 只显示两个
zrevrange mysort 0 -1 由大到小的排序查看所有元素key
zrevrange mysort 0 -1 withscores 由大到小的排序查看所有元素key与score
zscore mysort ls 查看ls的值
zcount mysort 80 90 查看80到90之间的有几个
删除元素 zrem mysort zs ww 删除zs ww
zremrangebyrank mysort 0 4 删除指定范围的元素
zremrangebyscore mysort 80 100 删除指定score范围的元素
修改元素 zincrby mysort 3 ls 给ls加3
适用场景 例如大型游戏积分排名,微博热点排名 构建索引数据
四.Keys的通用操作
keys * 所有的keys的查看
keys my? 查看所有my开头的
del my1 my2 my3 删除key
exists my1 查看my1是否存在
get name
rename name myname 重命名key 将name重命名为myname
expire myname 1000 给某一个key设置有效时间 1000秒
ttl myname 查看剩余的有效时间
type myname 获取key的类型
五.Redis 特性
多数据库
Redis事务
5.1多数据库
最多可以提供16个数据库实例,下标分别从0-15
客户端默认连接的是0号数据库
可以通过select来选择连接哪个数据库
select 1 选择1号数据库
move myset 1 将当前数据库中的myset移动到1号数据库
5.2 Redis事务
某一个命令执行失败,后边的命令还会继续执行
multi 开启事务 类似于session.open
exec 提交 commit
discard 回滚 rollback
六.Redis持久化
两种方式
RDB持久化 默认支持
优势 灾难恢复 启动效率高
劣势 服务器宕机时 数据丢失
配置
AOF持久化
可以同时使用RDB与AOF
无持久化 可以配置禁用 当作缓存用
领取专属 10元无门槛券
私享最新 技术干货