Redis
为大数据时代适配
读写分离: 分布式主机,指定主机处理写,指定主机处理读
减轻数据的压力,使用缓存来保证效率
进化历程:
1.优化数据结构和索引
2.文件缓存
3.缓存
1.NoSQL
用户日志,产生的数据,爆发式的数据增长使得关系数据库不能达到了瓶颈,所以要寻求突破,找到一个可以适合处理这些数据的方法。
泛指非关系型数据库,Redis是发展最快的NoSQL数据库。
存储的数据没有固定的数据类型
方便扩展(数据间没有关系,很好扩展)
大数据量高性能(Redis1s写8万字,读取11万,NoSql是一种细粒度的缓存)
数据类型多样型(无需设计数据库)
RDBMS和NoSQL的区别:
RDRMS:
- 结构化组织
- SQL
- 数据和关系都存在单独的表中
- 数据定义语言
- 严格的一致性
- 基础的
NoSql:
- 不仅仅是数据
- 没有固定的查询语言
- 键值对存储,列存储,文档存储,图形数据库
- 最终一致性
- CAP定力和BASE (异地多活)
- 高性能,高可用,高可扩展性
大数据时代3V+3高:
3V:
- Volume 海量
- Variety 实时
- Velocity 多样
3高:
- 高并发
- 高可扩
- 高性能
NoSQL四大分类:
- KV键值对,Redis
- 文档型数据库,MongoDB:基于分布式文件存储的数据库,C++编写,用来处理大量的文档,介于关系与非关系中的数据库
- 列存储数据库,HBase,Riak,分布式文件系统
- 图形关系数据库,Neo4j,InfoGrid,Infiniter Graph,存放关系,例如社交关系
2.数据处理方式
不同的信息存放在不同的数据库中:
商品基本信息: 使用mysql
商品的评论: MongoDB,counchDB,文档型数据库
商品图片:分布式文件系统,Hadoop HDFS, 阿里云 oss
商品关键字: 搜索引擎 ISearch
商品的热门信息: 内存数据库 Redis、Tair、Memache
商品的交易: 调用第三方接口
大型互联网应用特点:
- 数据类型多
- 数据源繁多
- 数据改造难
3.Redis USE(Remote Dictionary Server)
C 语言编写,内存数据库,key-value数据库,结构化数据库
持久化:存到本地(rdb,aof)
Do What?
- 发布订阅系统
- 地图信息分析
- 计时器
- 效率高,可用于高速缓存
- 内存存储、持久化
特点:
- 数据类型多样化
- 持久化
- 集群
- 事务
安装:
- sudo apt install redis
- 启动: redis-server
- 测试连通: redis-cli -p 6379
- ping
- set name min
- get name
关闭:
- shutdown
查看redis进程是否开启:
- ps -ef | grep redis
redis性能测试:
- 工具: benchmark
- redis-benchmark -h localhost -p 6379 -c 100 -n 10000
-n: 主机
-p:端口号
-c: 指定并发连接数
-n :指定请求数
基础知识:
- 默认有16个数据库
- 默认使用第0个数据库
- 使用select进行切换数据库(select 3)
- dbsize: 数据库大小
- flushdb: 清空数据库
- flushall: 清空所有数据库
- keys *: 查看所有的键
- Redis是单线程
- Redis基于内存操作,Redis的瓶颈是依赖机器的内存和网络带宽
- 快的原因: Redis所有数据都放在内存中
3.Redis data type
Redis—Key:
- set key value: 新增键值对
- get key: 获取key值
- exists key: 判断键是否存在
- move key dbNum: 移动key到指定的数据库
- expire key time: 设置自动过期
- ttl key: 查看过期剩余时间
- type key: 查看键的类型
4.String (字符串) 类型:
- append key value: 在原字符串后追加新字符串
- strlen key: 返回键所对应值的长度
- incr key: 键所对应的值加一
- decr key:键所对应的值减一
- incrby key num: 为键对应的值设定指定增长量num
- decrby key num: 为键对应的值设定指定减少量num
- getrange key num1 num2:获取指定范围的字符串内容
- getrange key 0 -1: 查看所有字符串
- setrange key offset value: 修改指定位置开始的字符串
- setex key:设置过期时间
- setnx key value: 不存在再设置
- mset k1 v2 k2 v2 k3 v3: 批量设置值
- mget k1 k2 k3 k4: 批量获取值
- msetnx k1 v1 k2 v2: 不存在再批量设置,原子性设置
- set user:1 {key2:value2,key2:value2}: 设置一个user:1对象,值为json字符
- mgat user:1
- mset user:1:key1 value1 user:1:key2 :value2
- mget user:1:key1 user:1:key2
- getset key value: 先get再set,获取原来的值再设置新的值,如果不存在则返回nil,并创建新键值对
- 使用场景:计数器、统计多单位的数量、粉丝数、对象缓存存储
5. List (列表)类型:
- list可以实现栈、队列
- lpush key value :将一个值push到队列左边
- rpush key value : 将一个值push到栈 右边
- lrange key start end: 获取区间内的值
- lpop key: 移除左边第一个元素
- rpop key: 移除右边第一个元素
- lindex key 0: 通过索引获取值
- llen key: 获取list长度
- lrem list count value: 移除count个值为value的值
- ltrim key start stop: 通过索引截取指定长度的列表
- rpoplpush source soutceother: 将一个列表中的最后一个元素移到另一个列表的顶部
- exists list: 判断list是否存在
- lset key index value: 将列表中指定索引的值替换为另外一个值,list和索引须要先存在,更新操作
- linsert key before | after pivot value: 将value插到pivot后或者前
6.Set(集合) 类型:
set中元素不能重复
- sadd key value: 向指定set中添加值
- smembers key: 查看指定set的所有值
- sismember key value: 查看某个值是否在该set中
- scard key: 获取set集合中的内容元素个数
- srem key value: 移除set集合中的指定元素
- spop myset: 随机删除一个元素
- srandmember key [count]: 随机抽选出一个元素,[指定个数]
- smove key source destination member: 将制定元素移动到另一个set集合
- sdiff key key: 计算两个set集合的差集(不同的元素)
- sinter key key: 计算两个set集合的交集(相同的元素) 例:共同好友
7.Hash (哈希)类型:
Map集合,key<key,value>
* hset key field value: 向指定hash中添加key-value
* hget key field: 从指定hash中根据key取值
* hmset key field1 value2 field2 value2: 向指定hash中添加多个值
* hmget key field1 field2
* hdel key field: 删除hash指定的key
* hgetall key : 获取hash所有的键值对
* hlen key: 获取hash的键值对数量
* hexists key field: 判断hash中指定字段是否存在
* hkeys key:获取哈希中所有的键
* hvals key:获取hash中所有的值
* hsetnx key field value: 如果hash中此键不存在则可以设置值
* hincrby key field increment: 指定增量
应用:设置变更的数据,用户信息的保存,经常变动的信息
8.Zset (有序集合) 类型:
* zadd key score member: 向zset中添加值
* zrange key start stop: 获取zset中的值
* zrangebyscore key -inf +inf: 从小到大排序
* zrevrange salary 0 -1: 从大到小排序
* zrangebyscore salary -inf +inf withscores:按照从小到大排序显示全部的用户并附带数据
* zrem key member: 移除有序集合中的指定数据
* zcard key: 获取有序集合中的个数
* zcount key start stop: 获取指定区间的成员数量
应用: 排行榜、工资表排序
9.geospatial (地理位置)类型:
* geoadd key longitude latitude member: 添加纬度经度名称信息,geoadd china:city 102.839667 24.885953 kunming
* geopos key member: 获取指定城市的经度和纬度
* geodist key member1 member2 : 返回两个地点之间的距离
单位:km、m、ft、mi
* georadius key longitude latitude radius: 以给定的经纬度为中心,找出某一半径内的元素/ georadius china:city 102 24 5000 km withcoord withdist count 2
withdist: 带出距离
withcoord: 带出经纬度
count : 限制查询出的数量
* georadiusbymember key member radius : 基于成员查询周围的成员/georadiusbymember china:city beijing 3000 km
* geohash key member : 返回11个字符的Geohash字符串,将二维经纬度转换为一维字符串,如果字符串越近,则距离越近/geohash china:city xian
有效的经度:180到180
有效的纬度:-85到85
两级无法直接添加
功能:推算地理位置的信息,两地之间的距离,周围的人
应用:附近的人、打车距离计算、朋友定位
底层: 基于zset实现,可以使用zrem来移除元素
* zrange china:city 0 -1: 查询所有元素
* zrem china:city kunming: 移除指定元素
Hyperloglog数据结构
* pfadd key element element: 添加元素
* pfcount key: 统计元素数量
* pfmerge key key1: 将key1中元素合并到key中
功能:用来基数统计的算法
应用:网页访问量统计,剔除同一用户多次访问
缺点:会有统计错误
优点:占用的内存小
其他方法:使用set保存不重复用户id
BitMaps数据结构
* setbit key offset value: 记录打卡状态
* getbit key offset: 获取某天打卡状态
* bitcount key
位存储
应用:用于有两个状态的信息类型,只有0和1两个状态。统计用户信息,活跃、不活跃、登陆、未登陆、打卡
Redis事务
本质:一组命令的集合,事务会按照顺序执行,不保证原子性,没有隔离级别的概念,只有发起执行命令的时候才会执行。
- 开启事务(multi)
- 命令入队(入队的时候不会被执行)
- 取消事务(discard)
- 执行事务(exec)
错误:
编译型异常,队列中一条命令有错,事务中所有的命令都不会被执行
运行时异常,如果事务队列中存在命令语法错误,那么执行命令的时候,其他命令可以正常执行,错误命令抛出异常。/set key one ,incr key(字符串自增报错)
Redis 监控
悲观锁:什么时候都会出现问题,无论做什么都会加锁
乐观锁:什么时候都不会出现问题,无论做什么都不会上锁。更新数据时会判断此期间数据是否有被修改过。
watch key: 加锁,监视线程,watch可以实现乐观锁操作。如果另一个线程修改了数据,当前线程会执行失败。
unwatch key: 解锁
Jedis
Redis官方推荐的Java连接开发工具,java操作Redis中间件。
安装:brew install redis
启动:brew services start redis
关闭:brew services stop redis
连接:redis-cli
关闭连接: shutdown
-
导入Jedis:
redis.clients
jedis
3.6.3
-
导包:
import redis.clienets.jedis.Jedis; -
测试连通性
Jedis jedis = new Jedis(“host”, “port”);
System.out.Println(jedis.ping())
常用API
String
List
Set
Map
ZSet
springboot 整合Redis
sprintboot2.x之后,jedis被替换为lettuce
jedis: 采用直连,存在线程不安全情况,使用连接池解决不安全问题
lettuce: 采用netty,不存在线程不安全情况,实例可以在多个线程中进行共享
新建springboot项目,选择nosql----->redis
@Bean
@ConditionalOnMissingBean(
name = {"redisTemplate"}
)//可以自己定义一个redisTemplate来替换默认的
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
//两个泛型都是object类型,需要强制转换为string
//默认redisTemplate没有过多的配置,redis需要序列化
RedisTemplate<Object, Object> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)//由于string是redis中最常用的类型,单独提出来了一个bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
return new StringRedisTemplate(redisConnectionFactory);
}
配置文件:
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.database=0
//导入template
private RedisTemplate redisTemplate;
传递对象需要序列化
Redis.conf
启动时通过Redis.conf
- 文件位置:cd /usr/local/etc/redis.conf
单位,大小写不敏感
1k => 1000 bytes
1kb => 1024 bytes
1m => 1000000 bytes
1mb => 10241024 bytes
1g => 1000000000 bytes
1gb => 10241024*1024 bytes
units are case insensitive so 1GB 1Gb 1gB are all the same.
包含其他文件
include /path/to/local.conf
include /path/to/other.conf
include /path/to/fragments/*.conf
bind 127.0.0.1 ::1 绑定的ip
protected-mode yes 开启保护模式
port 6379 绑定的端口号
通用GENNERAL
daemonize no #以守护进程的方式运行,默认是no
pidfile /var/run/redis_6379.pid #若以后台的方式运行,需要指定一个pid文件
#日志级别
Specify the server verbosity level.
This can be one of:
debug (a lot of information, useful for development/testing)
verbose (many rarely useful info, but not a mess like the debug level)
notice (moderately verbose, what you want in production probably) #默认
warning (only very important / critical messages are logged)
loglevel notice
#日志文件名
logfile “”
#数据库数量
databases 16
#是否显示logo
always-show-logo no
SNAPSHOTTING 快照
Redis 主从复制
概念:将一台Redis服务器的数据复制到其他Redis服务器,前者称为主节点(master/leader),后者称为从节点(slave/follower)。
规则:数据的复制是单向的,只能从主节点到从节点。Master以写为主,slave以读为主。单台Redis最大使用不超过20G。默认情况下,每台Redis服务器都是主节点,一个主节点有多个从节点,但一个从节点只有一个主节点。
优点:减缓服务器压力。
作用:
数据冗余:
数据的热备份。
故障恢复:
主节点有问题,通过从节点提供服务。
负载均衡:
分担服务器负载,写少读多。
高可用:
哨兵、集群的基础。
环境配置:
* info replication: 查看信息
```sql
127.0.0.1:6379> info replication
Replication
role:master #角色
connected_slaves:0 #从机数量
master_failover_state:no-failover
master_replid:0af3df9a9b291ed25d9693ab17e0eb758680e9e9
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
```
哨兵模式(Sentinel)
Redis2.8开始,自动选主机的模式。
通过向主机发送指令,等待回应,如果不回应代表服务器已经宕机。