Redis(一)
NoSql概述
为什么要用Nosql
面对大数据,一般的数据库无法分析处理了 !!!
技术和业务在发展的同时,对人的要求也越来越高了
本质:数据库(读,写)
慢慢的就开始使用分库分表来解决写的压力!MySql在那个年代推出了表分区(并没有多少公司使用)!
MySql的集群,很好的满足了那个年代的需求
2010 ~ 2020十年之间世界已经发生了翻天覆地的变化;(定位:也是一种数据,音乐 , 热榜,浏览量~~)
MySql这种关系型数据库已经不够用了!数据量很大,变化很快~!
MySQL有人用它来存储一些很大的文件,博客,图片,数据库表很大,效率就很低了
如果有一种数据来专门处理这种数据
MySQL的压力就会变得十分小(研究如何处理这些问题!)大数据的IO压力下,表几乎没法更改(1亿数据, 加列)
目前一个基本的互联网项目!!!
为什么要用NoSQL!!!
用户的个人信息,社交网络,地理位置,用户自己产生的数据,用户的日志等等的爆发式增长!
这种时候我们就需要使用NoSQL数据库,NoSQL数据库可以很好的处理以上情况
什么是NoSQL
NoSQL = Not Only SQL(不仅仅是SQL)
关系型数据库:表格(行和列)
泛指非关系型数据库,随着Web2.0网站,互联网的诞生!传统的关系型数据库很难对付web2.0时代!尤其是超大规模的高并发社区!!!,暴露出来很多难以克服的问题。
NoSQL在当今大数据环境下发展的十分迅速,Redis是发展最快的,而且是我们当下必须要掌握的技术!!!
用户的个人信息,社交网络,地理位置,用户自己产生的数据,用户的日志等等这些类型的数据的存储不需要一个固定的格式!不需要多余的操作就可以横向扩展的!Map<String, Object> 使用键值对来控制!
NoSQL的特点
- 方便拓展(数据之间没有关系,很好拓展!!!)
- 大数据量高性能(Redis 一秒写8万次,读取11万次,NoSQL的缓存记录级,是一种细粒度的缓存,性能会比较高)
- 数据类型是多样型的!(不需要事先设计数据库!随取随用!如果是数据量十分大的表,很多人就无法设计了)
- 传统RDBMS和NoSQL
传统的 RDBMS
- 结构化组织
- SQL
- 数据和关系都存在单独的表中 row column
- 数据操作,数据定义语言
- 严格的一致性
- 基础的事务操作
- …..
NoSQL
- 不仅仅是数据
- 没有固定的查询语言
- 键值对存储,列存储,文档存储,图形数据库(社交关系)
- 最终一致性
- CAP定理 和 BASE (异地多活)
- 高性能,高可用,高可扩展性
- ……
了解:3V+3高
大数据时代的3V:主要是描述问题的
- 海量Volume
- 多样Variety
- 实时Velocity
大数据时代的3高:主要是对程序的要求
- 高并发
- 高可扩(随时水平拆分,机器不够了,可以添加机器解决)
- 高性能(保证用户体验和性能)
真正在公司中的实践:NoSQL+ RDBMS一起使用才是最强的,阿里巴巴的架构引进
技术没有高低之分,就看如何使用!(提升内功,思维的提高!)
阿里巴巴演进分析
思考问题:
- 数据类型太多了
- 数据源繁多,经常重构 !
- 数据要改造,需要大面积改造 ?
NoSQL的四大分类
KV键值对
- 新浪:Redis
- 美团:Redis + Tair
- 阿里,百度,美团:Redis +memacache
文档型数据库(bson和json一样)
Redis入门
查看redis进程是否开启
使用redis-server 指定的配置文件,可以根据指定的配置文件启动
使用shutdown可以关闭redis 服务器
redis-benchmark性能测试
官方自带的测试工具
测试:100个并发连接,每个并发10万请求
redis-benchmark -h 127.0.0.1 -p 6379 -c 100 -n 100000
Redis基础知识
Redis默认有16个数据库
默认使用的第0个数据库
可以使用 select 来切换数据库
DBSIZE 查看数据库大小
keys * 查看数据库所有的key
flushall 清空全部数据库
flushdb 清空当前数据库
思考为什么:redis端口号是6379
Redis 是单线程的:明白Redis是很快的,Redis是基于内存操作的,CPU不是Redis的性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程实现,就使用单线程了
EXISTS xxx 判断字段是否存在
move xxx 移除字段
EXPIRE xxx [seconds] 设置字段过期时间
ttl xxx 可以看到字段还有多久过期
type key 查看key类型
incr key
decr key
incrby key 指定增量
decrby key 指定减量
getrange key start end 获取范围值(闭区间)
getrange key 0 -1 获取全部字符串
setrange key offest xxx 相当于replace
setex 设置过期时间
setnx 不存在在设置
mset 批量设置
mget 批量获取
设置对象
数据结构是相通的
List
类似链表 每一个key对应一个链表
LPUSH : Lpush key v1 v2 ….
LRANGE: lrange key start end
RPUSH:
LPOP: LPOP key 从左边取出
RPOP
LINDEX: LIndex key 最左边为0的index
LLEN
LREM :LREM key count value 移除指定个数的value 从左边开始
LTRIM:截取一段 Ltrim key start end(0 ~ n)(最左边下标为0)
RPOPLPUSH:右出左进
LSET :替换指定key指定index的value
LINSERT: 插入指定的key的指定的value的前后
SET(集合)
set中的值是不能重复的
1 | 127.0.0.1:6379> sadd myset "hello" |
- SADD
- SMEMBERS
- SISMEMBER
- SCARD:求SIZE
- SREM
- SRANDMEMBER:随机取出指定个数
- SPOP:随机删除
- SDIFF: 求差集
- SINTER:求交集
- SUNION:求并集
Hash
- HSET
- HGET
- HMSET
- HMGET
- HGETALL
- HDEL
- HLEN
- HEXISTS
- HKEYS
- HVALS
- HINCRBY
- HSETNX
ZSet
- ZADD
- ZRANGE
- ZRANGEBYSCORE
- ZREM
- ZCARD
- ZCOUNT
Geospatial
- GEOADD
- GEOPOS
- GEODIST
- GEORADIUS
- GEORADIUSBYMEMBER
- GEOHASH
Hyperloglog
- PFADD
- PFCOUNT
- PFMERGE
如果允许容错就可以使用这个
如果不允许容错就使用set或者自己的数据类型即可
Bitmaps
- setbit
- getbit
- bitcount
事务
知其然并知其所以然,授人以渔!慢慢来会很快
首先导入依赖
1 | <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> |
测试连接
1 | public class testPing { |
总计之前学习过的命令
String(字符串)
List(列表)
Set(集合)
Hash(散列)
ZSet(有序集合)
Geospatial(地理位置)
Hyperloglog
Bitmaps
Jedis开启事务
1 | Jedis jedis = new Jedis("127.0.0.1", 6379); |