pergrand 发表于 2016-6-29 00:33:28

初学redis数据库笔记


redis数据库

非关系型数据库(nosql)

键值对内存数据库,应用数据量不是很大,高并发,增删频繁对增删性能要求高

key只能是字符串
value:字符串,哈希map, list,set,sorted set.

特点:
高性能读写速度是10万次每秒左右
原子性数据的准确性
持久存储RDB/快照;AOF/日志
主从结构    master-slave         ;针对高并发,实现负载均衡2.高可用(挂一台继续可以使用)
redis3.0支持集群: 内存是集群的每台电脑的和



1.解压
2.改名
3.编译 make
make install ;将src下的文件复制到src/local/bin;相当于添加到环境变量,任何目录可以执行。
4.复制配置文件到/etc/
修改/etc/redis.cof 后台启动yes,日志存储位置
        daemonize yes(后台运行)
         logfile /usr/local/redis/log(日志文件,目录必须存在)

redis-server /etc/redis.cof
查看:ps -ef | grep redis
5.redis-cli客户端连接
rdis-cli -h 127.0.0.1 -p 6379同上 默认
6.quit退出
7.redis-cli shutdown关闭服务


修改进入虚拟机进入路径 vi ~/.bashrccd/usr/local source ~/.bashrc


redis 16个数据库,默认客户端连接0号数据库 select 2选择数据库


插入数据set a 1 查看 keys *
flushall 清空所有数据库 并不完全隔离
flushdb清空当前数据库

命令(命令不区分大小写)
set key value
keys *?   \?特殊字符转义key中有?

exists key 是否存在
del key 删除成功返回1
type key 返回值类型
help set(set用法)

String
set/get
mset/mget批量增加查询
incr/incrby/incrbyfloat
decr/decrby 递减值,指定步长递减
append 拼接字符串返回长度
strlen 获取长度

Hash
常用存对象
hset/hmset
hget/hmget/hgetall
hexits
hincrby 值的属性自增步长
hdel
hkeys/hvals
hlen

list
lpush list1 a
rpush list2 b 从右边添加元素
lrange list1 0 2 查询
lpop list1 从左边出栈
rpop
llen list1
lrange list 0 -1 查询所有
lindex list1 2 指定位置元素
lset list1 o a 修改
ltirm list1 0 2 截取


set
sadd set1 a 添加成功返回1
smembers set1 获取所有元素
srem set1 a 删除元素a
sismember 判断是否存在元素
del set1
sdiff set1 set2差集顺序有关 sinter交集 sunion并集
sdiffstore set3 set1 set2
scard ste1 长度
spop ste1 随机取一个元素

sorted set 有序集合类型 散列表和跳跃表
list 双向链表
zadd zset1 10 a
zscore zset1 a 获得元素分值
zrange zset1 0 -1 获得所有元素
zrevrange zset1 0 2 前三名
zrangebyscore zset1 2 10闭区间
zrangebyscore zset1 2 (10 开区间
zincrby zset1 100 a
zcrad zset1
zcount set1 1 10
zremzset1 a

zadd zset1 +inf m正无穷 最大值
zadd zset1 -inf n

set命令 如果key有其他类型值 set覆盖就值无视类型。

利用java代码操作redis
<dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>2.8.1</version>
        </dependency>
       
使用jedis 依赖 第三方jar
单机连接 new Jedis(host,port);
单机连接池连接:new JedisPool(config,host,port)
开放6379端口


redis中的键生存时间
expire key time
查看剩余生存时间:ttl key
                -2:键不存在或者键已经被删掉
                -1:永久键
                >-1:处于剩余生存时间内
               
        取消生存时间:persist key
应用场景:
手机验证码
积分排行榜
限时促销




redis事务
        multi
        ......
        exec
一组命令一块执行,执行这组命令不被其他命令插入
redis事务和基本命令一样,都是最小单元

没有回滚

语法错误编译时错误,不会被执行
运行错误,导致有些命令成功有些失败;


事务命令不会立即执行,只有提交事务才执行,incr命令时(睡觉),其他命令插入,会有问题
使用watch :
监控指定键值,当值变化时停止后面事务,利用递归总有一次执行。


编译异常不会执行,
运行异常 会执行没有回滚;



sort排序
help sort
sort list1 by score:* 根据成绩排序
list1中的值对应score:1234如果score对应的参考建值不存在,则值为0

sort list2 by stu:*->age 根据hash值的年龄排序
sort list2 by stu:*->age get # get stu:*->age get stu:*->name
根据年龄排序   返回 id 年龄 姓名

如果排序数据量很大,尽量使用store参数将结果缓存


发布订阅
        subscribe 频道名称               
        publish 频道名称 消息


先进先出队列
list :lpush rpop 左进右出

优先级
brpop list1 list2 list3 timeout 阻塞3秒,设置优先级

redis 管道
向redis数据库批量入库一批数据,建议使用管道提高速度
redis-cli 没有实现,在jedis中实现。



redis持久化
RDB 快照方式
当满足一定条件,redis会执行快照操作,在本地生成一个dum.rdb快照文件
可以定时备份数据库
可能会丢失最后一次备份以后的数据
aof日志文件
redis如果运行很久,日志文件很大,redis会重写
针对当前状态生成命令保存日志文件,把之前的覆盖掉

如果两种都开的话,先动态切换开启aof再修改配置文件
        config set appendonly yes


redis 安全策略
设置数据库密码
修改配置requirepass password
验证密码auth password

bin ip 指定ip访问,可以跟多个ip

redis-cli
info 查看信息
monitor调试命令,监视

redis.cn
redis.or

redis优化
限制内存大小 maxmemory
数据总量不可预估,内存有限 设置限制内存大小
maxmemory-policy 内存不足时 ,数据清除策略

内存清楚策略
lru算法


主从结构

搭建(同上)
在从节点的配置文件中slaveof

原理
当从节点启动时 向主数据库发送sync同步命令
主节点接到命令会保存快照(rdb),同时将接收到的命令缓存起来
快照完成发送给从节点快照文件和缓存命令
从节点载入快照文件,执行缓存命令

启动之后主从同步 通过命令实现

slaveof no one 将从节点设为主节点

读写分离
人为实现 在代码中 封装两个工具类,一个读,一个写

主节点持久化,或者设置为挂掉之后不重启。

redis sentinel
监控
提醒
自动故障转移

主从+sentinel架构

sentinel监控每个节点并且sentinel之间也有通信


主观下线状态:
单个sentinel服务对节点做出下线判断

客观下线状态:
多个sentinel服务对主节点做出的下线判断
(sentinel与节点通信如果没有通信判断下线,当客观下线时才会执行故障转移)


主节点:主观下线和客观下线
从节点:主观下线


启动sentinel服务
复制 sentinel.cof
修改 sentinel monitor mymaster1 ip port 2
启动 redis-sentinel /ect/sentinel.cof前台启动可以加入daemonize yes设置后台启动

定义频道信息进入sentinel
redis-cli -p 26379
subscribe -sdown主观下线



redis集群

redis 集群中有slot哈希槽
默认有16384个哈希槽
哈希槽分配到所有集群主节点中
redis集群中数据存储到slot中


搭建集群
sed -i "45s/6379/7000/" redis.cof





集群扩容
添加节点 添加完主节点之后是个空的 需要分配哈希槽
./redis-trib.rb add-node 新增节点 集群节点

./ redis-trb.rb reshard 集群节点 重新分配哈希槽
分配各个
接收节点的id
从哪分配哈希槽 all

添加从节点
./redis-trib.rb add-node 新增节点 集群节点
redis-cli -c -p 从节点端口 cluster replicate 要成为的主节点的id

删除节点

删除从节点
redis-trib.rb del-node 192.168.1.160:70007002e2b66b9d3b384981bcbe7d09954638ed82fb

删除主节点
将哈希槽分配给其他主节点,
指定谁接,只能是某个节点id,继续输入要删除掉节点id,done
删除

java 操作redis集群


总结2:
config命令
config set
config get *
设置后立即生效,redis重启失效
2.安全策略
设置密码requirepass oassword
验证密码auth password
绑定ip   bind ip只能本机访问redis数据库

命令重命名
rename-command flushall clean
金庸命令
rename-command flushall ""


redis客户端
redis-cli
info
monitor 监视器


redis的内存相关
redis的存储能力和服务器的可用内存相关
100w个键值对会占用100M左右内存

redis优化
键值优化,名字或者键值精简
slowlog 查看慢查询日志
slowlog get
限制redis内存 什么时候需要限制内存
不限制时会使用linux的swap分区,redis性能下降
maxmemory 限制可用内存
开启持久化 设置为系统内存的45%
没开启持久化 设置为系统内存的95%

限制内存后占满内存不在添加数据,希望添加的话设置清楚策略


应用场景


主从复制
高并发性能,节点挂掉数据不安全
实现负载均衡,实现高可用



sentinel
主从复制:主从节点不能自动切换,如果主节点挂,主从架构不能添加数据

使用sentinel来解决
监控主从节点,主节点挂掉,自动将从节点切换为主节点,就是自动故障转移

jedissentinelpool类 java操作


集群

主从+sentinel数据的存储容量每提高,单节点存储能力有限
集群实现扩容

jedisCluster类 java操作






               
       
       

hahaxixi 发表于 2016-6-29 20:23:52

感谢分享~~~

pergrand 发表于 2016-6-30 01:49:33

hahaxixi 发表于 2016-6-29 20:23
感谢分享~~~

笔记有点乱,但愿能看懂

SuperDove 发表于 2017-9-14 11:32:26

java 操作redis集群
楼主,这个有案例代码么,我在网上查了一堆,结果都使用的是JedisPool,这个只能指定一个host+port,跟集群模式有点不搭边。
譬如有3 master,3 slave 模式,如何用java api指定随机写一台redis服务器并且在获取的时候能指定到redis服务器去取值。
我后来使用过ShardedJedisPool,通过传入JedisShardInfo的list集合,结果使用getResource()获取到的对象也是操作不了,说要使用JedisCluster 这个类操作,但是我使用JedisCluster指定所有机器和port之后,把key,value在所有机器上都有写入了,这我又感觉不像集群模式了,迷茫....新人求指导

pergrand 发表于 2017-10-11 18:36:03

SuperDove 发表于 2017-9-14 11:32
java 操作redis集群
楼主,这个有案例代码么,我在网上查了一堆,结果都使用的是JedisPool,这个只能指定一 ...

不好意思很久没来看了;是读写的问题是吧;应该解决了吧
页: [1]
查看完整版本: 初学redis数据库笔记