redis基本数据类型

Redis特性
速度快
Redis使用标准C编写实现,而且将所有数据加载到内存中,所以速度非常快。官方提供的数据表明,在一个普通的Linux机器上,Redis读写速度分别达到81000/s和110000/s。
数据结构
可以将Redis看做“数据结构服务器”。目前,Redis支持5种数据结构。

string 、hash(对象存储)、list(粉丝列表、lrange分页、简单的消息队列)

set(粉丝交集)、sorted set 排行榜

高并发、高性能

数据库一般建议并发不超过2000/s

单机Qps一般不超过10w+

单线程实现高并发?

1、纯内存操作 2、io多路复用、 3单线程避免切换上下文

客户端与AE_readbale 事件  io多路复用程序(加入队列不阻塞)、  文件事件分配器(连接应答、命令请求、命令应答)

一致行hash算法   环


持久化
由于所有数据保持在内存中,所以对数据的更新将异步地保存到磁盘上,Redis提供了一些策略来保存数据,比如根据时间或更新次数。数据超过内存,使用swap,保证数据;
memcacache不能持久化,mongo是部分在内存;
自动操作
Redis对不同数据类型的操作是自动的,因此设置或增加key值,从一个集合中增加或删除一个元素都能安全的操作。
支持多种语言
Redis支持多种语言,诸如Ruby,Python, Twisted Python, PHP, Erlang, Tcl, Perl, Lua, Java, Scala, Clojure等。
主-从复制
Redis支持简单而快速的主-从复制。
官方提供了一个数据,Slave在21秒即完成了对Amazon网站10Gkey set的复制。
Sharding
很容易将数据分布到多个Redis实例中,但这主要看该语言是否支持。目前支持Sharding功能的语言只有PHP、Ruby和Scala。

二、数据类型

Strings
Hashs
Lists
Sets
Sorted Sets

三、持久化

通常Redis将数据存储在内存中或虚拟内存中,它是通过以下两种方式实现对数据的持
久化。
3.1.快照方式:(默认持久化方式)
这种方式就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为
dump.rdb。
客户端也可以使用save或者bgsave命令通知redis做一次快照持久化。save操作是在
主线程中保存快照的,由于redis是用一个主线程来处理所有客户端的请求,这种方式会阻
塞所有客户端请求。所以不推荐使用。另一点需要注意的是,每次快照持久化都是将内存数
据完整写入到磁盘一次,并不是增量的只同步增量数据。如果数据量大的话,写操作会比较
多,必然会引起大量的磁盘IO操作,可能会严重影响性能。
注意:由于快照方式是在一定间隔时间做一次的,所以如果redis意外当机的话,就会
丢失最后一次快照后的所有数据修改。
3.2.日志追加方式:
这种方式redis会将每一个收到的写命令都通过write函数追加到文件中(默认
appendonly.aof)。当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整
个数据库的内容。当然由于操作系统会在内核中缓存write做的修改,所以可能不是立即写
到磁盘上。这样的持久化还是有可能会丢失部分修改。不过我们可以通过配置文件告诉
redis我们想要通过fsync函数强制操作系统写入到磁盘的时机。有三种方式如下(默认是:
每秒fsync一次)
appendonlyyes //启用日志追加持久化方式
#appendfsyncalways //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全
的持久化,不推荐使用
appendfsynceverysec //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折
中,推荐
#appendfsyncno //完全依赖操作系统,性能最好,持久化没保证
日志追加方式同时带来了另一个问题。持久化文件会变的越来越大。例如我们调用incr
test命令100次,文件中必须保存全部100条命令,其实有99条都是多余的。因为要恢复
数据库状态其实文件中保存一条settest100就够了。为了压缩这种持久化方式的日志文件。
redis提供了bgrewriteaof命令。收到此命令redis将使用与快照类似的方式将内存中的数据

以命令的方式保存到临时文件中,最后替换原来的持久化日志文件。

主从同步
5.1.Redis主从复制简介
10
Redis支持将数据同步到多台从库上,这种特性对提高读取性能非常有益。
1) master可以有多个slave。
2) 除了多个slave连到相同的master外,slave也可以连接其它slave形成图状结构。
3) 主从复制不会阻塞master。也就是说当一个或多个slave与master进行初次同步数据
时,master可以继续处理客户端发来的请求。相反slave在初次同步数据时则会阻塞
不能处理客户端的请求。
4) 主从复制可以用来提高系统的可伸缩性,我们可以用多个slave专门用于客户端的读
请求,比如sort操作可以使用slave来处理。也可以用来做简单的数据冗余。
5) 可以在master禁用数据持久化,只需要注释掉master配置文件中的所有save配置,然
后只在slave上配置数据持久化。
5.2.Redis主从复制的过程介绍
当设置好slave服务器后,slave会建立和master的连接,然后发送sync命令。无论是
第一次同步建立的连接还是连接断开后的重新连接,master都会启动一个后台进程,将数据
库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存起来。后台进程完
成写文件后,master就发送文件给slave,slave将文件保存到磁盘上,然后加载到内存恢复
数据库快照到slave上。接着master就会把缓存的命令转发给slave。而且后续master收到
的写命令都会通过开始建立的连接发送给slave。从master到slave的同步数据的命令和从客
户端发送的命令使用相同的协议格式。当master和slave的连接断开时slave可以自动重新
建立连接。如果master同时收到多个slave发来的同步连接命令,只会启动一个进程来写数
据库镜像,然后发送给所有slave。
配置slave服务器很简单,只需要在配置文件中加入如下配置

slaveof192.168.1.16379 #指定master的ip和端口

Redis Cluster集群

其结构特点:
     1、所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
     2、节点的fail是通过集群中超过半数的节点检测失效时才生效。
     3、客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
     4、redis-cluster把所有的物理节点映射到[0-16383]slot上(不一定是平均分配),cluster 负责维护node<->slot<->value。
     5、Redis集群预分好16384个桶,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个桶中。
群包含主节点A、B、C, 以及从节点A1、B1、C1, 那么即使B挂掉系统也可以继续正确工作。如果节点B和B1同时挂了,Redis集群就无法继续正确地提供服务了。

 

public final class RedisLockUtil {

    Logger logger = LoggerFactory.getLogger(RedisLockUtil.class);

    public static  final  String REDIS_SYNCBINDROOM_KEY ="syncbindroom_key_";

    public static  final  String REDIS_SYNCPERSON_KEY ="syncperson_key_";

    /**
     *分布式锁默认超时时间
     */
    public static  final  int LOCK_TIMEOUT=3*60*1000;

    @Autowired
    JedisCluster jedisCluster;

    public boolean lock(String taskId, String requestId) {
        String message = jedisCluster.set(taskId, requestId, "NX", "PX", LOCK_TIMEOUT);
        if (!"OK".equals(message)) {
            logger.info("[RedisLockUtil] begin get lock failed  taskId:" + taskId);
            return false;
        }
        logger.info("[RedisLockUtil ] begin get lock success  taskId:" + taskId);
        return true;
    }

    public boolean unLock(String taskId, String requestId) {
        //此处为redis执行的lue脚本,通过执行脚本的方式,实现校验和删除的原子性
        String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
        Object result = jedisCluster.eval(script, Collections.singletonList(taskId), Collections.singletonList(requestId));
        if (new Long(1).equals(result)) {
            jedisCluster.del(taskId);
            logger.info("[RedisLockUtil unLock] free lock on task success: taskId: " + taskId + " requestId: " + requestId);
            return true;
        }
        logger.info("[RedisLockUtil unLock] free lock on task failed: taskId: " + taskId + " requestId: " + requestId);
        return false;

    }

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值