资源列表:
redis
是一个开源(bsd许可
)的内存中的数据结构存储,用作数据库、缓存和消息中间件。它支持多种数据结构,如字符串
、哈希表
、列表
、无序集合
、有序集合
的范围查询,位图
、基数统计
和地理空间索引
的与查询。redis内置复制
、lua脚本
、lru回收
、事务
和不同级别的磁盘持久化
,并通过哨兵
和自动分区
提供高可用性集群。
fork()
可能会非常耗时multi
开启事务,exec
执行事务
可以看到,redis事务实现原理是将要执行的命令,存储到一个队列中,依次执行,报错时停止并取消事务,不报错则提交事务。
例外:不会回滚的情况:
当一个事务中某一条(多条)命令加入队列不报错,执行时才会报错,则redis会忽略错误继续执行。
使用watch
监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。当exec
被调用时, 不管事务是否成功执行, 对所有键的监视都会被取消。或者调用unwatch
手动取消监控。
lua是一个高效的轻量级脚本语言,用标准c语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能,从定义上来说, redis 中的脚本本身就是一种事务, 所以任何在事务里可以完成的事, 在脚本里面也能完成。 并且一般来说, 使用脚本要来得更简单,并且速度更快。
默认支持16个数据库;可以理解为一个命名空间
跟关系型数据库不一样的点
通过 select dbid 去选择不同的数据库命名空间 。 dbid的取值范围默认是0 -15
redis cluster中,sharding采用slot(槽)的概念,一共分成16384个槽,这有点儿类似前面讲的pre sharding思路。对于每个进入redis的键值对,根据key进行散列,分配到这16384个slot中的某一个中。使用的hash算法也比较简单,就是crc16后16384取模。redis集群中的每个node(节点)负责分摊这16384个slot中的一部分,也就是说,每个slot都对应一个node负责处理。当动态添加或减少node节点时,需要将16384个槽做个再分配,槽中的键值也要迁移。当然,这一过程,在目前实现中,还处于半自动状态,需要人工介入。redis集群,要保证16384个槽对应的node都正常工作,如果某个node发生故障,那它负责的slots也就失效,整个集群将不能工作。为了增加集群的可访问性,官方推荐的方案是将node配置成主从结构,即一个master主节点,挂n个slave从节点。这时,如果主节点失效,redis cluster会根据选举算法从slave节点中选择一个上升为主节点,整个集群继续对外提供服务。这非常类似服务器节点通过sentinel监控架构成主从结构,只是redis cluster本身提供了故障转移容错的能力。
默认存储最大容量为512m
常用命令:、、、、、、、
有序,可重复
常用命令:、、、、、、、
不支持数据类型的嵌套
适合存储对象
常用命令:、、、、、、、、
无序、不重复
常用命令:、、、、、
有序、不重复
常用命令:、
常用命令:、
常用命令:
首先,到redis官网找到要安装的redis版本,redis下载页,我们这里选用v4.0.11
,依次执行下面命令:
# wget http://download.redis.io/releases/redis-4.0.11.tar.gz # tar xzf redis-4.0.11.tar.gz # cd redis-4.0.11 # make
到此安装完成,然后可以通过make test
测试编译状态
# make test
无报错完成编译应该会有这样的输出:
报错:需要tcl 8.5以上来运行redis test
you need tcl 8.5 or newer in order to run the redis test
make: *** [test] error 1
下面安装tcl8.6.1
:
# wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz # sudo tar xzvf tcl8.6.1-src.tar.gz # cd tcl8.6.1/unix/ # sudo ./configure # sudo make # sudo make install
再次运行make test
,没问题之后,运行最后一步,完成安装:
# make install
直接启动:
# ./redis-server ../redis.conf
后台启动redis,只需修改redis.conf
配置文件的daemonize yes
,再次启动即可。
# ./redis-server ../redis.conf
# ./redis-cli shutdown
# redis-cli
# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> config get requirepass 1) "requirepass" 2) ""
127.0.0.1:6379> config set requirepass 123456 //密码是123456 ok
bitmap 对于一些特定类型的计算非常有效。
假设现在我们希望记录自己网站上的用户的上线频率,比如说,计算用户 a 上线了多少天,用户 b 上线了多少天,诸如此类,以此作为数据,从而决定让哪些用户参加 beta 测试等活动 —— 这个模式可以使用 和 来实现。
比如说,每当用户在某一天上线的时候,我们就使用 ,以用户名作为 key
,将那天所代表的网站的上线日作为 offset
参数,并将这个 offset
上的为设置为 1
。
举个例子,如果今天是网站上线的第 100 天,而用户 peter 在今天阅览过网站,那么执行命令 setbit peter 100 1
;如果明天 peter 也继续阅览网站,那么执行命令 setbit peter 101 1
,以此类推。
当要计算 peter 总共以来的上线次数时,就使用 命令:执行 bitcount peter
,得出的结果就是 peter 上线的总天数。
更详细的实现可以参考博文(墙外) 。
setnx
+lua
实现
public class redistool { private static final string lock_success = "ok"; private static final string set_if_not_exist = "nx"; private static final string set_with_expire_time = "px"; private static final long release_success = 1l; // 获取锁 public static boolean getlock(jedis jedis, string lockkey, string requestid, int expiretime) { string result = jedis.set(lockkey, requestid, set_if_not_exist, set_with_expire_time, expiretime); if (lock_success.equals(result)) { return true; } return false; } // 释放锁 public static boolean releaselock(jedis jedis, string lockkey, string requestid) { string script = "if redis.call('get', keys[1]) == argv[1] then return redis.call('del', keys[1]) else return 0 end"; object result = jedis.eval(script, collections.singletonlist(lockkey), collections.singletonlist(requestid)); if (release_success.equals(result)) { return true; } return false; } }
incr
+lua
脚本实现
参考链接:
更多信息可以关注我的个人博客:或
如对本文有疑问, 点击进行留言回复!!
修复 Mac brew 安装 mongodb 报 Error: No available formula with the name ‘mongodb’ 问题详解
MongoDB中数据的替换方法实现类Replace()函数功能详解
网友评论