一、什么是Redis
说起redis不得不提的就是nosql(非关系型数据库),数据之间没有像关系型数据库那样存在关联,不用复杂的sql语句操作,用key-value,列存储,文档存储多种形式;redis就是使用的key-value的形式存储的,直接把数据存放在内存中,也有自己的持久化存储机制,最大的优点就是访问速度炒鸡快
二、redis使用及命令
- 使用
环境搭建在linux
①解压文件 tar -xvf redis-2.6.16.tar.gz -C /usr/local
②进入redis-2.6.16目录 使用make命令编译redis
③在redis-2.6.16目录中 使用make PREFIX=/usr/local/redis install命令安装 redis到/usr/local/redis中
④拷贝redis-2.6.16中的redis.conf到安装目录redis中
⑤启动redis 在bin下执行命令redis-server redis.conf
⑥如需远程连接redis,需配置redis端口6379在linux防火墙中开发
/sbin/iptables -I INPUT -p tcp –dport 6379 -j ACCEPT
/etc/rc.d/init.d/iptables save
redis.conf配置文件很重要,在后边的持久化会有一点的讲解
如果按照上述步骤操作完,那么恭喜你,现在你可以开始使用redis了
小demo,使用前先把commons-pool.jar和jedis.jar导入到项目中
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxIdle(50);
poolConfig.setMinIdle(10);
poolConfig.setMaxTotal(100);
JedisPool pool = new JedisPool(poolConfig,"192.168.17.128",6379);
Jedis jedis = pool.getResource();
String str = jedis.get("address");
System.out.println(str);
代码不用过多解释,给Jedis连接池传入配置文件,linux的ip及port即可
2.命令
了解命令之前需要先了解一下redis中value的数据类型都有哪些
key - string 普通字符串类型
key - lists list集合底层是链表结构,可参考LinkedList
key - sets set集合,无序,唯一
key - sortedset 有序的set集合,唯一
key - hash hash表,键值对形式
①String
set key value 把值value存放在key中
get key 根据key值取得value值
getset key value 先去key的值,再设置key的值为value
incr key 把key对应的值value +1,如果value非数字类型字符串则报错,如果key不存在,执行完incr key之后变为1
decr key 与incr相反,为-1
incrby key increment 为key的值+increment
decrby key increment 为key的值-increment
②lists类型,数据结构如下
lpush key values 存放多个values到key中,方向为左边
lrange key start end 查询key中从start到end的值,start=0 为头部-1为尾部
lpop key 删除key中左边第一个值
llen key 计算key的长度
lpushx key value 先检查是否有key,如果有则插入左边头值value
lrem key count value 从左边开始删除count个value值,如果count=0则删除全部
lset key index value 设置角标为index的值为value
linsert key after value1 value2 从左边,在value1的后边插入value2
rpoplpush source destination 从source右边拿出一个值放在destination的左边
以上全是从左边操作list,如果想从右边操作list用r*即可
③sets
sadd key values 为key添加多个value值
smembers key 查询全部value
srem key member 删除某个value
sismember key value 检查value是否存在
sdiff key1 key2 返回结果为除了和key2交集之外key1中的值
sinter key1 key2 返回key1和key2的交集
sunion key1 key2 返回结果为key1和key2的并集
scard key 返回结果为key中的数量
srandmember key 随机去一个成员
sdiffstore destination key1 key2 返回key1和key2交集之外key1的值,并存放在destination中
④sortedset:排序是根据每个值的权重
zadd key score value1 score value2 存放值时分配好权重
zscore key memeber 返回成员查询其权重是多少
zrange key start end withscores 按照权重查询角标从start到end的值
zcard key 获得key中数量
zrem key members 移除某个成员
zrevrange key start end withscores 根据权重查询角标从start到end的值并倒序
zremrangebyrank key start stop根据权重删除元素,默认从小到大
zincrby key increment member 为member增加权重increment
zcount key min max 查询权重为min到max值的个数
zrank key member 返回某个值其权重所在位置(排名)
⑤hash
hset key filed value 为key设置键值对为filed-value
hgetall key 返回key中所有的filed-value
hget key filed 返回key中filed对应的值
hmset key fileds 设置多个filed-value
hmget key fileds 得到key中多个fileds的值
hexists key filed 检查key中是否存在filed
hlen key 返回key中包含的filed-value的数量
hincrby key filed increment 为key中的filed对应的值+increment
以上是对于redis中五种数据类型的部分命令,记是记不住,大概了解一下都能对这些数据结构分别做什么操作,以后用到了再查资料
下面还有一些对于keys的常用操作
keys * 查询所有集合
del key删除集合
exists key 检查key是否存在
rename key1 key2 给key1重命名为key2
expire key second 设置key的过期时间为second秒
ttl key 检查key所剩时间,如果未设置那么返回-1,已超时 -2
type key 查看key的类型
三、订阅与事务
- 订阅
subscribe cctv 订阅cctv,等待发布内容
publish cctv values 发布内容,订阅者可以即时接收到
由于是在内存中操作,实时性很强,可以用来做即时通讯 - 事务
multi 开启事务
exec 提交
discard 回滚
这里的事务和数据库的时候不同,这里可以理解为批量处理,开启事务后,然后逐条执行命令,但是这些命令都不会提交直到你执行exec才会提交,但是就算其中产生错误也不会自动回滚,除非手动执行discard,取消之前的操作
四、持久化
尽管redis是在内存中操作数据,效率很高,但是在内存中的数据是很不稳定的,一旦服务器挂掉,那么所有数据都没了,所以redis提供两套数据持久化的方案,分别是RDB和AOF
RDB:默认开启的 持久化方式
- 以快照的形式存放数据,每隔一段时间自动备份一份数据,注重结果
- 优点:适合大数据量
缺点:会丢失一部分数据,运行期间占用服务器资源较多
在文章刚开头提到了,redis.conf文件,默认RDB配置如下
save 900 1 如果key更改十次以内,那么900秒备份一次
save 300 10 如果key改动十次以上,那么300秒备份一次
save 60 10000 如果key改动一万次以上,那么60秒备份一次
先不说效率如何,就单单这个时间间隔就有点长,最短也有可能会丢失一分钟内的数据AOF:默认关闭的
AOF机制是把对于redis的每次操作的命令记录下来,通常相同数据量,aof文件要比rdb大,在恢复redis文件时执行一遍记录的所有命令达到数据恢复的作用,注重过程优点:保存的数据比较完整
缺点:文件大,数据恢复慢
针对AOF,redis有三种策略,分别是每秒钟同步,没修改同步和不同步
redis.conf配置文件如下
always everysec no
五、小结
- 据说新浪微博目前有搭建有最大的redis集群,通过分析redis以上功能,也会发现很适合新浪微博的需求,内容的订阅,热搜,排名,持久化
- 以上算是对redis的整体认识吧,命令不用记,知道大概有什么功能即可用的时候来查,对于持久化这块感觉,公司发展达到一定程度才会是研究的重点