redis的相关知识
-
redis的linux安装和使用
-
redis切换数据库以下命令在redis的客户端进行
- redis默认为15个数据库 select 数字 切换数据库 默认从0开始
- dbsize查看有多少个key
- 查看所有的key keys *
- 清除所有库 flushall
- 清除当前库 flushdb
-
关于key的命令
- exists key 查看key是否存在 返回为数字 1 or 0
- move key db 移动数据key到哪个数据库
- EXPIRE key seconds 设置key的过期时间以秒为单位
- TTL key 查看当前key还有多长时间过期 -1 表示永不过期 -2 表示已经过期过期就不存在了
- del key 删除key
- 再次set key value 是覆盖以前的值
- type key 获取key的类型
-
关于redis-string(字符串)的命令
- set key value 设置key-value值
- get key 获取到value的值
- append key 追加内容
- STRLEN k3 获取value的长度
- INCR key 每次增加一个key中的value的值,值必须为数字类型
- DECR key 每次减少一个key中的value的值,值必须为数字类型
- INCRBY key 想要增加的值 value中的值加上你的所设置的值
- DECRBY key 想要减少的值
- GETRANGE key start end 获取key对应的value的值类似于between…and 范围取值
- SETRANGE key offset value 插入你的所输入的值从你写的下标开始 范围设置
- SETEX key seconds value 设置value的值同时设置存活时间
- SETNX key value 设置值key不存在才能成功。
- MSET key value [key value …] 批量插入数据
- MGET key [key …]批量获取数据
- MSETNX k1 v1 k2 v2 k3 v3 k4 v4 批量设置不存在的值
-
关于redis-list(列表)的相关命令
- LPUSH key value [value …] 插入一个list数据 先进后出
- LRANGE key start stop 范围取出list中的数据根据下标取值
- RPUSH key value [value …] 插入一个list数据 先进先出
- LPOP key 取出第一个数 取出这个数之后这个数将不再存在
- RPOP key 取出最后一个数 取出这个数之后这个数将不再存在
- LINDEX key index 根据下标查询所对应的值
- LLEN key 查看list所对应的长度
- LREM key count value 删除N个value
- LTRIM key start stop截取这个list的值并赋值给他
- RPOPLPUSH source destination 取出一个列表中的最后一个数放入另一个列表的第一个数
- LSET key index value根据下标给列表中的这个元素赋值
- LINSERT key BEFORE|AFTER pivot value 在这个列表的哪个数据前或者后插入一条数据
-
关于redis-set(集合)的相关命令
- SADD key member [member …] 插入一组数据且插入的数据不能重复,如果有重复的则会自动去重。
- SMEMBERS key 查看集合中的数据
- SISMEMBER key member 查看集合中是否有这个值,有则返回1,没有则返回0
- SCARD key查看集合中的元素个数
- SREM key member [member …] 删除集合中的元素的值
- SRANDMEMBER key [count] 在这个集合中挑选几个随机数
- SPOP key [count] 随机出栈
- SMOVE source destination member 把一个集合里面的数据移动到另一个集合中。
- SDIFF key [key …]求差集简单来说就是取第一个有后面都没有的元素
- SINTER SDIFF key [key …] 求交集
- SUNION key [key …]求并集
-
关于redis-hash(哈希)的相关命令
- HSET key field value 插入数据插入的数据是以key-value存在的
- HGET key field 取出数据的值
- HMSET key field value [field value …]批量插入数据
- HMGET key field [field …] 批量取出数据
- HGETALL key取出所有的值
- HDEL key field [field …]删除指定的数据
- HLEN key 所有元素的长度
- HEXISTS key field 查看这个值是否存在,如果存在则返回1不存在则返回0
- HKEYS/HVALUES key 取出所有的key或value
- HINCRBY key field increment 增加一个整数值
- HINCRBYFLOAT key field increment增加一个小数值
- HSETNX key field value 插入一个数据存在则不插入,不存在则插入
-
关于redis-zset(有序集合)的相关命令
-
ZADD key [NX|XX] [CH] [INCR] score member [score member …] 插入数据
ZADD zset01 60 v1 70 v2 80 v3 90 v4 100 v5 举例 根据 60 ,70 进行排序
-
ZRANGE key start stop [WITHSCORES] 取出集合中的元素 取出所有元素是0 -1 加上WITHSCORES则是取出 值加上前面的排序依据
ZRANGE zset01 0 -1 ZRANGE zset01 0 -1 withscores
-
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] 根据这个分数范围内的值
ZRANGEBYSCORE zset01 60 90 //60-90之间的数据 ZRANGEBYSCORE zset01 60 (90 //大于等于60小于90的数据 ZRANGEBYSCORE zset01 (60 (90 //大于60小于90的数据 ZRANGEBYSCORE zset01 60 90 limit 2 2 //截取60 -90 之间的数据 从2 开始截取两个
-
ZREM key member [member …] 删除某个数据
-
ZCARD/ZCOUNT key 统计数据的个数
-
ZRANK key member 查看某个值得下标
-
ZSCORE key member 查看对应值得分数
-
ZREVRANGE key start stop [WITHSCORES] 逆序获取对应的值
-
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count] 逆序取范围的值
-
-
redis的配置文件的介绍
-
单位不一样
# 1k => 1000 bytes # 1kb => 1024 bytes # 1m => 1000000 bytes # 1mb => 1024*1024 bytes # 1g => 1000000000 bytes # 1gb => 1024*1024*1024 bytes
-
大小写区分不敏感
-
tcp-backlog 511 设置tcp的backlog,backlog其实是一个连接队列,在高并发的环境下需要一个高的backlog值来解决慢客户端的连接问题。
-
timeout 0 多长时间关闭这个连接
-
loglevel notice 日志级别
-
设置密码在redis的客户端输入config set requirepass “123456” 输入密码必须在输入命令之前auth 输入密码
-
maxmemory 最大内存数
-
maxmemory-policy noeviction 过期策略 默认为永不过期
volatile-lru 使用lru算法移除key,只对设置了过期时间的键 最近最少使用 allkeys-lru 使用lru算法移除key volatile-random 随机移除key,只对设置了过期时间的键 allkeys-random 随机移除key volatile-ttl 有限时间内
-
maxmemory-samples 5
-
daemonize yes 设置进程为守护进程
-
-
redis的持久化
-
rdb 将内存中的数据在一定时间内写入到磁盘中最大的缺陷就是有可能会丢失最后的一份数据。
save "" 禁用 save 900 1 15分钟内key改变一次则存储一次 save 300 10 5分钟内key改变了10次则存储一次 save 60 10000 1分钟内key改变了10000次则保存一次 rdbcompression yes 是否启动压缩算法 stop-writes-on-bgsave-error yes 后台出错是否停止写入 rdbchecksum yes 存储快照之后进行校验利用crc64算法
-
aof:记录redis的写操作 形成appendonly.aof文件
-
appendonly yes 打开aof配置默认为no
-
appendfilename “appendonly.aof” aof的文件名字
-
启动redis会先加载aof如果aof文件损坏则启动失败。
-
redis-check-aof 修复损坏的aof文件。
# appendfsync always 每次数据发生改变都会写入磁盘 appendfsync everysec 每秒写入这个是默认的设置 # appendfsync no 从不写入 auto-aof-rewrite-percentage 100 设置重写的基准值 auto-aof-rewrite-min-size 64mb 设置重写的基准值 no-appendfsync-on-rewrite no 默认aof文件的增加为文件的追加
-
Rwrite aof采用的是文件追加方式,文件会越来越大为了避免这种情况,所以增加了重写机制,当文件达到一定的阈值时,redis就会启动aof的文件压缩。
-
-
-
事务
- 开启事务 MULTI 全体连坐一个执行失败则全部失败不能加入队列 如果可以加入队列然后出现数据错误就会发生一个报错其他放行。
- 执行命令 EXEC
- 放弃事务 DISCARD
- WATCH监控
- 乐观锁 给数据加版本号如果版本号不对则抛出异常 提高了吞吐量
- 悲观锁 锁表、
- UNWATCH 之前加的监控锁都会被取消
-
发布订阅
- PUBLISH channel message 发布消息
- SUBSCRIBE channel [channel …] 订阅消息
-
主从架构只需要指定从节点 主master 从 slave
- info replication 查看当前信息
- 配置从节点slaveof 主机的IP加端口
- 实现了读写分离主节点负责写,从节点负责读
- 薪火相传后如果主机挂掉中间的如果想要当主节点必须执行SLAVEOF NO ONE
-
哨兵模式
-
创建文件sentinel.conf
sentinel monitor 被监控的主机的名字 ip 端口 票数
-
启动哨兵 redis-sentinel /sentinel.conf 文件
-
缺点就是有延时
-
-
java的连接和测试
-
修改配置文件
#bind 127.0.0.1 这个配置应该关闭 默认是开启的 protected-mode no 改为yes 默认为yes 不然会出现连接失败 package com.redis; import java.util.Set; import redis.clients.jedis.Jedis; /** * Redis的api * @author Administrator * */ public class TestApi { public static void main(String[] args) { Jedis jedis=new Jedis("hadoop",6379); System.out.println(jedis.ping()); jedis.set("k1","v1"); jedis.set("k2","v2"); jedis.set("k3","v3"); System.err.println(jedis.get("k1")); Set<String> keys = jedis.keys("*"); System.out.println(keys.toString()); } } package com.redis; import redis.clients.jedis.Jedis; import redis.clients.jedis.Transaction; /** * redis的事务 * @author Administrator * */ public class TestTx { public static void main(String[] args) { Jedis jedis=new Jedis("hadoop",6379); Transaction transaction=jedis.multi(); transaction.set("k4","v4"); transaction.set("k5","v5"); transaction.exec();//开启事务 //transaction.discard(); 放弃事务 System.out.println(jedis.mget("k1","k2","k3","k4","k5")); } } package com.redis; import redis.clients.jedis.Jedis; /** * redis的主从复制 * @author Administrator * */ public class TestMS { public static void main(String[] args) { Jedis jedis_m=new Jedis("hadoop",6379); Jedis jedis_s=new Jedis("hadoop",6380); jedis_s.slaveof("hadoop", 6379); jedis_m.set("calss","1122"); System.err.println(jedis_s.get("calss")); } }
-
-
使用redis的连接池
package com.redis; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; public class JedisPoolUtil { private static volatile JedisPool jedisPool=null; private JedisPoolUtil() {} public static JedisPool getJedisPoolInstance() { if(jedisPool==null) { synchronized (JedisPoolUtil.class) { if(jedisPool==null) { JedisPoolConfig poolConfig=new JedisPoolConfig(); poolConfig.setMaxActive(1000);//设置线程的最大活跃数 poolConfig.setMaxIdle(32);//设置最大空闲线程 poolConfig.setMaxWait(100*1000);//设置borrow最大等待时间 poolConfig.setTestOnBorrow(true);//设置是否开启borrow检测 jedisPool=new JedisPool(poolConfig, "hadoop", 6379); } } } return jedisPool; } /** * 归还连接 * @param jedisPool * @param jedis */ public static void release(JedisPool jedisPool,Jedis jedis) { if(jedis!=null) { jedisPool.returnResourceObject(jedis); } } } package com.redis; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; public class TestPool { public static void main(String[] args) { JedisPool jedisPool = JedisPoolUtil.getJedisPoolInstance(); Jedis jedis=null; jedis=jedisPool.getResource(); try { jedis.set("aa","bb"); } catch (Exception e) { e.printStackTrace(); }finally { JedisPoolUtil.release(jedisPool, jedis); } } }