redis怎么使用(redis怎么使用跳表)
本篇文章给大家谈谈redis怎么使用,以及redis怎么使用跳表对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、springboot怎么使用redis
- 2、怎么使用redis控制用户的已经玩的次数
- 3、linux下redis 怎么使用
- 4、大厂面试题详解:如何用Redis实现分布式锁?
- 5、ruby on rails怎么使用redis
- 6、window 下安装redis后代码怎么使用
springboot怎么使用redis
引入jedis就行了。
package com.vic.config;
import org.apache.log4j.Logger;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
*
* @author pieryon
*
*/
@Configuration
@EnableAutoConfiguration
@ConfigurationProperties(prefix = "spring.redis", locations = "classpath:application.properties")
public class RedisConfig {
private static Logger logger = Logger.getLogger(RedisConfig.class);
private String hostName;
private int port;
private String password;
private int timeout;
@Bean
public JedisPoolConfig getRedisConfig(){
JedisPoolConfig config = new JedisPoolConfig();
return config;
}
@Bean
public JedisPool getJedisPool(){
JedisPoolConfig config = getRedisConfig();
JedisPool pool = new JedisPool(config,hostName,port,timeout,password);
logger.info("init JredisPool ...");
return pool;
}
public String getHostName() {
return hostName;
}
public void setHostName(String hostName) {
this.hostName = hostName;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getTimeout() {
return timeout;
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
}
[img]怎么使用redis控制用户的已经玩的次数
你可以把这两个属性按key-value存储到redis中,可以使启衡哗用redis的incr方法。例如:redis.incr("zan")和redis.incr("cai");这个方法是原子性增加的,是线程安全的,如果之前存在zan和cai会拦悄自悄行动加1,如果不存在会自动保存并加1.
linux下redis 怎么使用
1. 安装,软件仓库里有的并且满足需要那就直接从软件仓库里安装
ubuntu: sudo apt-get install redis-server
centOS: yum install redis
其他的也差不多
另一种编译安装就比较麻烦一点,去官网下载合适的版磨搜本的源代码,make ...
2. 使用 a)命令行使用 redis-cli
b) shell 调用同a
c) 通过其他语言调用,比如php,则需要安装php-redis扩展,Python则需要安宴卖装瞎祥历Python-redis模块,其他语言类似,然后就是在各个语言中根据api调用啦
大厂面试题详解:如何用Redis实现分布式锁?
说一道常见面试题:
一个很简单的答案就是去使用 Redission 客户端。Redission 中的锁方案就是 Redis 分布式锁得比较完美的详细方案。
那么,Redission 中的锁方案为什么会比较完美呢?
正好,我用 Redis 做分布式锁经验十分丰富,在实际工作中,也 探索 过许多种使用 Redis 做分布式锁的方案,经过了无数血泪教训。
所以,在谈及 Redission 锁为什么比较完美之前,先给大家看看我曾经使用 Redis 做分布式锁是遇到过的问题。
我曾经用 Redis 做分布式锁是想去解决一个用户抢优惠券的问题。这个业务需求是这样的:当用户领完一张优惠券后,优惠券的数量必须相应减一,如果优惠券抢光了,就不允许用户再抢了。
在实现时,先从数据库中先读出优惠券的数量进行判断,当优惠券大于 0,就进行允许领取优惠券,然后,再将优惠券数量减一后,写回数据库。
当时由于请求数量比较多,所以,我们使用了三台服务器去做分流。
这个时候会出现一个问题:
如果其中一台服务器上的 A 应用获取到了优惠券的数量之后,由于处理相关业务逻辑,未及时更新数据库的优惠券数量;在 A 应用处理业务逻辑的时候,另一台服务器上的 B 应用更新了优惠券数量。那么,等 A 应用去更新数据库中优惠券数量时,就会把 B 应用更新的优惠券数量覆盖掉。
看到这里,可能有人比较奇怪,为什么这里不直接使用 SQL:
原因是这样做,在没有分布式锁的协调下,优惠券数量可能直接会出现负数。因为当前优惠券数量为 1 的时候,如果两个用户通过两台服务器同时发起抢优惠券的请求,都满足优惠券大于 0 每个条件,然后都执行这条 SQL 说了句,结果优惠券数量直接变成 -1 了。
还有人说可以用乐观锁,比如使用如下 SQL:
这种方式就在一定几率下,很可能出现数据一直更新不上,导致长时间重试的情况。
所以,经过综合考虑,我们就采用了 Redis 分布式锁,通过互斥的方式,以防止多个客户端同时更新优惠券数量的方案。
当时,我们首先想到的就是使用 Redis 的 setnx 命令,setnx 命令其实就是 set if not exists 的简写。告则
当 key 设置值成功后,则返回 1,否则就返回 0。所以,这里 setnx 设置成功可以表示成获取到锁,如果失败,则说明已经有锁,可以被视作获取锁失败。
如果想要释放锁,执行任务 del 指令,把 key 删除即可。
利用这个特性,我们就可以让系统在返毁执行优惠券逻辑之前,先去 Redis 中执行 setnx 指令。再根漏友备据指令执行结果,去判断是否获取到锁。如果获取到了,就继续执行业务,执行完再使用 del 指令去释放锁。如果没有获取到,就等待一定时间,重新再去获取锁。
乍一看,这一切没什么问题,使用 setnx 指令确实起到了想要的互斥效果。
但是,这是建立在所有运行环境都是正常的情况下的。一旦运行环境出现了异常,问题就出现了。
想一下,持有锁的应用突然崩溃了,或者所在的服务器宕机了,会出现什么情况?
这会造成死锁——持有锁的应用无法释放锁,其他应用根本也没有机会再去获取锁了。这会造成巨大的线上事故,我们要改进方案,解决这个问题。
怎么解决呢?咱们可以看到,造成死锁的根源是,一旦持有锁的应用出现问题,就不会去释放锁。从这个方向思考,可以在 Redis 上给 key 一个过期时间。
这样的话,即使出现问题,key 也会在一段时间后释放,是不是就解决了这个问题呢?实际上,大家也确实是这么做的。
不过,由于 setnx 这个指令本身无法设置超时时间,所以一般会采用两种办法来做这件事:
1、采用 lua 脚本,在使用 setnx 指令之后,再使用 expire 命令去给 key 设置过期时间。
2、直接使用 set(key,value,NX,EX,timeout) 指令,同时设置锁和超时时间。
以上两种方法,使用哪种方式都可以。
释放锁的脚本两种方式都一样,直接调用 Redis 的 del 指令即可。
到目前为止,我们的锁既起到了互斥效果,又不会因为某些持有锁的系统出现问题,导致死锁了。这样就完美了吗?
假设有这样一种情况,如果一个持有锁的应用,其持有的时间超过了我们设定的超时时间会怎样呢?会出现两种情况:
出现第一种情况比较正常。因为你毕竟执行任务超时了,key 被正常清除也是符合逻辑的。
但是最可怕的是第二种情况,发现设置的 key 还存在。这说明什么?说明当前存在的 key,是另外的应用设置的。
这时候如果持有锁超时的应用调用 del 指令去删除锁时,就会把别人设置的锁误删除,这会直接导致系统业务出现问题。
所以,为了解决这个问题,我们需要继续对 Redis 脚本进行改动……毁灭吧,累了……
首先,我们要让应用在获取锁的时候,去设置一个只有应用自己知道的独一无二的值。
通过这个唯一值,系统在释放锁的时候,就能识别出这锁是不是自己设置的。如果是自己设置的,就释放锁,也就是删除 key;如果不是,则什么都不做。
脚本如下:
或者
这里,ARGV[1] 是一个可传入的参数变量,可以传入唯一值。比如一个只有自己知道的 UUID 的值,或者通过雪球算法,生成只有自己持有的唯一 ID。
释放锁的脚本改成这样:
可以看到,从业务角度,无论如何,我们的分布式锁已经可以满足真正的业务需求了。能互斥,不死锁,不会误删除别人的锁,只有自己上的锁,自己可以释放。
一切都是那么美好!!!
可惜,还有个隐患,我们并未排除。这个隐患就是 Redis 自身。
要知道,lua 脚本都是用在 Redis 的单例上的。一旦 Redis 本身出现了问题,我们的分布式锁就没法用了,分布式锁没法用,对业务的正常运行会造成重大影响,这是我们无法接受的。
所以,我们需要把 Redis 搞成高可用的。一般来讲,解决 Redis 高可用的问题,都是使用主从集群。
但是搞主从集群,又会引入新的问题。主要问题在于,Redis 的主从数据同步有延迟。这种延迟会产生一个边界条件:当主机上的 Redis 已经被人建好了锁,但是锁数据还未同步到从机时,主机宕了。随后,从机提升为主机,此时从机上是没有以前主机设置好的锁数据的——锁丢了……丢了……了……
到这里,终于可以介绍 Redission(开源 Redis 客户端)了,我们来看看它怎么是实现 Redis 分布式锁的。
Redission 实现分布式锁的思想很简单,无论是主从集群还是 Redis Cluster 集群,它会对集群中的每个 Redis,挨个去执行设置 Redis 锁的脚本,也就是集群中的每个 Redis 都会包含设置好的锁数据。
我们通过一个例子来介绍一下。
假设 Redis 集群有 5 台机器,同时根据评估,锁的超时时间设置成 10 秒比较合适。
第 1 步,咱们先算出集群总的等待时间,集群总的等待时间是 5 秒(锁的超时时间 10 秒 / 2)。
第 2 步,用 5 秒除以 5 台机器数量,结果是 1 秒。这个 1 秒是连接每台 Redis 可接受的等待时间。
第 3 步,依次连接 5 台 Redis,并执行 lua 脚本设置锁,然后再做判断:
再额外多说一句,在很多业务逻辑里,其实对锁的超时时间是没有需求的。
比如,凌晨批量执行处理的任务,可能需要分布式锁保证任务不会被重复执行。此时,任务要执行多长时间是不明确的。如果设置分布式锁的超时时间在这里,并没有太大意义。但是,不设置超时时间,又会引发死锁问题。
所以,解决这种问题的通用办法是,每个持有锁的客户端都启动一个后台线程,通过执行特定的 lua 脚本,去不断地刷新 Redis 中的 key 超时时间,使得在任务执行完成前,key 不会被清除掉。
脚本如下:
其中,ARGV[1] 是可传入的参数变量,表示持有锁的系统的唯一值,也就是只有持有锁的客户端才能刷新 key 的超时时间。
到此为止,一个完整的分布式锁才算实现完毕。总结实现方案如下:
这个分布式锁满足如下四个条件:
当然,在 Redission 中的脚本,为了保证锁的可重入,又对 lua 脚本做了一定的修改,现在把完整的 lua 脚本贴在下面。
获取锁的 lua 脚本:
对应的刷新锁超时时间的脚本:
对应的释放锁的脚本:
到现在为止,使用 Redis 作为分布式锁的详细方案就写完了。
我既写了一步一坑的坎坷经历,也写明了各个问题和解决问题的细节,希望大家看完能有所收获。
最后再给大家提个醒,使用 Redis 集群做分布式锁,有一定的争议性,还需要大家在实际用的时候,根据现实情况,做出更好的选择和取舍。
原文
ruby on rails怎么使用redis
对于在Rails上使用Redis Store,首先我们需要在Gemfile文件中添加入口
gem 'redis-rails'
gem 'redis-rack-cache' # optional
然后我们就会有如下选择:
## Cache Store
# config/environments/production.rb
config.cache_store = :redis_store
## Session Store
# config/initializers/session_store.rb
MyApplication::Application.config.session_store :redis_store,
servers: ['redis://:secret@192.168.6.23:6379/0', 'redis://:secret@192.168.6.99:6379/1']
## HTTP Cache
# config.ru
require 'rack'
require 'rack/cache'
require 'redis-rack-cache'
use Rack::Cache,
metastore: 'redis://localhost:6379/0/metastore',
entitystore: 'redis://localhost:6380/0/entitystore'
如你所见,使用这个插件相当简单,但现在我要教你如何去管理这些设置。
第一个案例不言自明,我们来说说用 ActiveSupport 来加载Redis Store。这里请记住,Redis的contraire仅仅只能支持字符串樱袭,所以可以利用序列化与反序列化技术来存储任何对脊没兄象。
这里的第二个案例就稍微复杂一点。察答首先,我们需要使用一个服务器集群。这里再重复一遍,Redis Store支持分片,也就意味着Http会话在两台服务器之间都是互相透明可见的。
最后一个案例主要涉及到Ruby的Http缓存代理,这些缓存的主要作用就是为了加快Http响应,而且也是以名值对的方式来存储meta数据以及entity实体对象的,这里也提一下,如果我们存储的都是普通的字符串文本,那么 mashalling模块也是不需要启动的。
虽然说了这么多,但就上面几点也只是 Redis store 所有功能的一小部分而已,其实它还支持Rack,Sinatra以及I18n。
总结
我个人认为 Redis 基本算是你的服务器环境必须用用的一个插件,它速度快而且可使用范围广泛,比如可以作为数据库,缓存,分片机等等,真算得上是一个不错的工具。然而任何好处都是有代价的:与Rails一样,为了使用它,你必须花费大量的时间与安装与配置才能在性能,以及内存使用上找到一个绝佳的平衡点。
您可能感兴趣的文章:
window 下安装redis后代码怎么使用
1下载安装文件,选择稳定版本 2解压后找到bin目录下的release下的redis-2.8.17 3点击安装exe文件,进行安装。选择好路径,一直到安装结束即可。 4点击Service查看Redis服务是否正确的安装。Windows--》Service.msc。默认的端口为6379。服务已启动。 5使用客户端工具进行连接,出现如下画面即成功。 6使用CMD工具,蚂稿安装另一个Redis实例服务,端口为6369.需要提前建好6369端口使用的conf文件 如:C:\Users\GrayE:\redis-2.8.17\redis-server.exe --service-installE:\redis-2.8.17\redis6369.conf --service-name RedisServer6369 --port 6369 试验了几次都没有李棚提示成功的信息,但是查看服务成功了,而且用客户端闷扰孝连接也成功了。 7查看6369端口的redis服务 8使用客户端连接6369 redis服务,出现如下界面表示成功 9至此,大功告成。
关于redis怎么使用和redis怎么使用跳表的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。