Ⅰ windows怎麼連接redis
1.首先是下載redis在windows下的文件
然後解壓出來放到一個目錄下,開啟一個redis服務
redis包下載裂戚
redis-server.exe
redis.conf
//進入redis目錄
開啟redis服務命令
2.重新開啟一個cmd命令窗口開始鏈接redis服務
redis-cli.exe
-h
192.168.12.21
//要連接的redis伺服器
auth
密碼培肆
//auth
+
密碼
連接進配源轎入redis
Ⅱ Redis連接數與最大連接數
查看:
方法1:在redis-cli命令行使用:info clients可以查看當前的redis連接數
127.0.0.1:6379> info clients
connected_clients:621
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
127.0.0.1:6379>
方法2:config get maxclients 可以查詢redis允許的最大連接數
127.0.0.1:6379> CONFIG GET maxclients
##1) "maxclients"
##2) "10000"
127.0.0.1:6379>
設置:
...
...
2.config set maxclients num 可以設置redis允許的最大擾鄭連接數
127.0.0.1:6379> CONFIG set maxclients 10
OK
127.0.0.1:6379>
3.啟動redis.service服桐純務時加參數--maxclients 100000來設置最大連接數限制
redis-server --maxclients 100000 -f /etc/redis.conf
獲取客戶端信息命令
CLIENT LIST 獲取客戶端列表緩輪頌
CLIENT SETNAME 設置當前連接點redis的名稱
CLIENT GETNAME 查看當前連接的名稱
CLIENT KILL ip:port 殺死指定連接
CLIENT LIST
##id=3 addr=127.0.0.1:36588 fd=5 name= age=7 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
CLIENT SETNAME js
##OK
CLIENT LIST
##id=3 addr=127.0.0.1:36588 fd=5 name=js age=37 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
CLIENT GETNAME
##"js"
CLIENT KILL id 3
##(integer) 0
釋放超時鏈接配置
查看超時配置
config get timeout
設置超時配置
config set timeout 600
Ⅲ 詳解Redis開啟遠程登錄連接
redis默認只能localhost登錄,所以需要開啟遠程登錄。
1、將 bind 127.0.0.1 ::1 這一行注釋掉。
這里的bind指的是只有指定的網段才能遠程訪問這個redis。 注釋掉後,就沒有這個限制了。或者bind 自己所在的網段。
band localhost 只能本機訪問,區域網內計算機不能訪問。
bind 區域網IP 只能區域網內IP的機器訪問, 本地localhost都無法訪問。
驗證方法:
2、將 protected-mode 要設置成no (默認是設置成yes的, 防止了遠程訪問,在redis3.2.3版本後)
3、設置遠程連接密碼
取消注釋 requirepass foobared,將 foobared 改成任意密碼,用於驗證登錄。默認是沒有密碼的就可以訪問的,我知悔們這里最好設置一個密碼。
4、重啟 reids
編輯/搭衫正etc/sysconfig/iptables,添加
以上只對本機和126.212.173.185開放6379埠,其他ip用telnet是無法連接的。如果訪問ip沒有限制,就不需要添加-s ip地址了,例如
重新啟動防火牆
很明顯,沒有包含6379埠。然後點擊右上的「添加安全組規則」塌凳 。填寫如下內容即可。 同理,如果准備使用其它埠,務必來添加相應安全規則。
然後確定。再重啟redis-server,就可以愉快的運行阿里雲伺服器上的redis了。o( ̄▽ ̄)d
Ⅳ redis 的持久化策略有幾種
Redis是一種高級key-value資料庫。它跟memcached類似,不過數據可以持久化,而且支持的數據類型很豐富。有字元串,鏈表,集 合和有序集合。支持在伺服器端計算集合的並,交和補集(difference)等,還頌埋支持多種排序功能。所以Redis也可以被看成是一個數據結構伺服器。
Redis的所有數據都是保存在內存中,然後不定期的通過非同步方式保存到磁碟上(這稱為「半持久化模式」);也可以把每一次數據變化都寫入到一個append only file(aof)裡面(這稱為「全持久化模式」)。
第一種方法filesnapshotting:默認redis是會以快照的形式將數據持久化到磁碟的(一個二進制文件,mp.rdb,這個文件名字可以指定),在配置文件中物啟的格式是:save N M表示在N秒之內,redis至少發生M次修改則redis抓快照到磁碟。當然我們也可以手動執行save或者bgsave(非同步)做快照。
工作原理簡單介紹一下:當redis需要做持久化時,redis會fork一個子進程;子進程將數據寫到磁碟上一個臨時RDB文件中;當子進程完成寫臨時文件後,將原來的RDB替換掉,這樣的好處就是可以-on-write
還有一種持久化方法是Append-only:filesnapshotting方法在redis異常死掉時,最近的數據會丟失(丟失數據的多少視你save策略的配置),所以這是它最大的缺點,當業務量很大時,丟失的數據是很多的。Append-only方法可以做到全部數據不丟失,但罩櫻如redis的性能就要差些。AOF就可以做到全程持久化,只需要在配置文件中開啟(默認是no),appendonly yes開啟AOF之後,redis每執行一個修改數據的命令,都會把它添加到aof文件中,當redis重啟時,將會讀取AOF文件進行「重放」以恢復到redis關閉前的最後時刻。
Ⅳ 解決redis連接超時
錯誤原因:redis連接池lettuce存在bug,伺服器網關畝銀派把長連接關閉了。
解決辦法:更換連接池,使用jedis
配置redis
redis:
host: 伺服器IP地址
port:6379
timeout: 3000
password: ~123456
jedis:
pool:
搏陵 max-active:8
迅賀 max-wait: 2000
max-idle:8
min-idle:0
time-between-eviction-runs: 1000
Ⅵ 如何連接redis
本人也是剛開始使用redis,目前接觸到的根據業務的不同連接redis的情況有兩種:
一:
1、先進到redis安裝目錄的bin目錄下,本人的機器安裝在這里,即/data/redis/bin
2、在/data/redis/bin目錄下可以發現有一個redis-cli文件,執行該文件後即可進入命令為:./redis-cli,由於有密碼,要輸入密碼,命令為:auth 密碼,出現ok的時候即已經進入了redis
1、一般測試在使用redis的時候,使用的命令改告也較少,在此列岩備舉常用的幾個:
查看所有的key:keys *
查看key的value:get 某核棗明個key
刪除某個key: del 某個key
Ⅶ php redis 長連接 多久會斷
$redis->connect($host, $port, $timeout);
最後一個參數就是超時時間緩枝瞎,長連接是不會斷的,除擾空非你自己搭物去close或者伺服器那邊斷了,這個時候可以捕獲錯誤,然後進行重連
Ⅷ (二)連接Redis,Lettuce與Jedis客戶端
Redis優勢
從 Spring Boot 2.x 開始 Lettuce 已取代 Jedis 成為首選 Redis 的客戶端。當然 Spring Boot 2.x 仍然支持 Jedis,並且你可以任意切換客戶端。
使用Lecttuce需要再引用一個包
配置
org.springframework.boot.autoconfigure.data.redis.RedisProperties中集成了Jedis與Lettuce。
概念:
Jedis:是Redis的Java實現客戶端,提供了比較全面的Redis命令的支持,
Redisson:實現了分布式和可擴展的Java數據結構。
Lettuce:高級Redis客戶端,用於線程安全同步,非同步和響應使用,支持集群,Sentinel,管道和編碼器。
優點:
Jedis:比較全面的提供了Redis的操作特性
Redisson:促使使用者對Redis的關注分離,提供很多分布式相關操作服務,例如,分布式鎖,分布式集合,可通過Redis支持延遲隊列
Lettuce:主要在一些分布式緩存框架上使用比散中較多
可伸縮:
Jedis:使用阻塞舉野的I/O,且其方法調用都是同步的,程序流需要等到sockets處理完I/O才能執行,不支持非同步。Jedis客戶端實例不是線程安全的,所以需要通過連接池來使用Jedis。
Redisson:基於Netty框架的事件驅動的通信層,其方法調用是非同步的。Redisson的API是線程安全的,所以可以操作單個Redisson連接來完成各種操作
Lettuce:基於Netty框架的事件驅動的通信層,其方法調用是非同步的。Lettuce的API是線程安全的,所以可以操作單個沖答山Lettuce連接來完成各種操作
Ⅸ 怎麼連接redis集群 使用jedis連接單機和集群redis的兩種方式
第一:非集群狀態下
非集群狀態下用Jedis獲取Redis連接,得到Jedis對象即可,一共有兩種:
1.利用Jedis構造器,僅限用於測試,在實際項目中肯定是用JedisPool。
Jedis(String host);
Jedis(String host , int port);
2.利用JedisPool
主要是利用Jedis jedis=jedisPool.getResource();
JedisPool有N多個構造器,常用的構造器參數有GenericObjectPoolConfig poolConfig,String host,int port,int timeout,String password,創建GenericObjectPoolConfig對象時我們一般用其子類JedisPoolConfig (redis.clients.jedis.JedisPoolConfig),timeout是連接redis伺服器的超時時間,以毫晌扮悄秒為單位,一般設置為0,如果不設為0,宴渣則不可設置太小,如果設成1、2,那麼可能因為網路原因在1毫秒、2毫秒之內沒有連上伺服器而報錯。見下例:
[java] view plain
public static void main(String[] args) {
JedisPoolConfig poolConfig = new JedisPoolConfig();
// 最大連接數
poolConfig.setMaxTotal(2);
// 最大空閑數
poolConfig.setMaxIdle(2);
// 最大允許等待時間,如果超過這個時間還未獲取到連接,則會報JedisException異常:
// Could not get a resource from the pool
poolConfig.setMaxWaitMillis(1000);
JedisPool pool = new JedisPool(poolConfig, "192.168.83.128", 6379, 0, "123");
Jedis jedis = null;
try {
for (int i = 0; i < 5; i++) {
jedis = pool.getResource();
jedis.set("foo"缺畢 + i, "bar" + i);
System.out.println("第" + (i + 1) + "個連接, 得到的值為" + jedis.get("foo" + i));
// 用完一定要釋放連接
jedis.close();
}
} finally {
pool.close();
}
}
如上,創建出一個JedisPool對象,然後調用其getResource()方法獲取redis連接即可,之後就可以調用Jedis API操作redis了。jedis連接用完要釋放即close,如果不close,則產生的連接會越來越多,當達到了最大連接數,再想獲得連接,就會等待,當超過了最大等待時間後就會報異常。
第二:集群狀態下
集群狀態下用Jedis獲取redis連接,是得到JedisCluster對象,之後對redis進行操作都是用此對象的方法進行的:
[java] view plain
public static void main(String[] args) {
JedisPoolConfig poolConfig = new JedisPoolConfig();
// 最大連接數
poolConfig.setMaxTotal(1);
// 最大空閑數
poolConfig.setMaxIdle(1);
// 最大允許等待時間,如果超過這個時間還未獲取到連接,則會報JedisException異常:
// Could not get a resource from the pool
poolConfig.setMaxWaitMillis(1000);
Set<HostAndPort> nodes = new LinkedHashSet<HostAndPort>();
nodes.add(new HostAndPort("192.168.83.128", 6379));
nodes.add(new HostAndPort("192.168.83.128", 6380));
nodes.add(new HostAndPort("192.168.83.128", 6381));
nodes.add(new HostAndPort("192.168.83.128", 6382));
nodes.add(new HostAndPort("192.168.83.128", 6383));
nodes.add(new HostAndPort("192.168.83.128", 6384));
JedisCluster cluster = new JedisCluster(nodes, poolConfig);
String name = cluster.get("name");
System.out.println(name);
cluster.set("age", "18");
System.out.println(cluster.get("age"));
try {
cluster.close();
} catch (IOException e) {
e.printStackTrace();
}
}
用集群時,好像沒有辦法設置集群的參數,比如最大連接數,雖然在創建JedisCluster 對象時傳了JedisPoolConfig對象進去,但是JedisPoolConfig對象中的設置是不生效的。
Ⅹ 如何在 Go 語言中使用 Redis 連接池
一、關於連接池
一個資料庫伺服器只擁有有限的資源,並且如果你沒有充分使用這些資源,你可以通過使用更多的連接來提高吞吐量。一旦所有的資源都在使用,那麼你就不 能通過增加更多的連接來提高吞吐量。事實上,吞吐量在連接負載較大時就開始下降了。通常可以通過限制與可用的資源相匹配的資料庫連接的數量來提高延遲和吞 吐量。
如何在Go語言中使用Redis連接池
如果不使用連接池,那麼,每次傳輸數據,我們都需要進行創建連接,收發數據,關閉連接。在並發量不高的場景,基本上不會有什麼問題,一旦並發量上去了,那麼,一般就會遇到下面幾個常見問題:
性能普遍上不去
CPU 大氏悉量資源被系統消耗
網路一旦抖動,會有大量 TIME_WAIT 產生,不得不定期重啟服務或定期重啟機器
伺服器工作不穩定,QPS 忽高忽低
要想解決這些問題,我們就要用到連接池了。連接池的思路很簡單,在初始化時,創建一定數量的連接,先把所有長連接存起來,然後,誰需要使用,從這里取走,幹完活立馬放回來。 如果請求數超出連接池容量,那麼就排隊等待、退化成短連接或者直接丟棄掉。
二、使用連接池遇到的坑
最近在一個項目中,需要實現一個簡單的 Web Server 提供 Redis 的 HTTP interface,提供 JSON 形式的返回結果。考慮用 Go 來實現。
首先,去看一下 Redis 官方推薦的 Go Redis driver。官方 Star 的項目有兩個:Radix.v2 和 Redigo。經過簡單的比較後殲知乎,選擇了更加輕量級和實現更加優雅的 Radix.v2。
Radix.v2 包是根據功能劃分成一個個的 sub package,每一個 sub package 在一個獨立的子目錄中,結構非常清晰。我的項目猛頌中會用到的 sub package 有 redis 和 pool。
由於我想讓這種被 fork 的進程最好簡單點,做的事情單一一些,所以,在沒有深入去看 Radix.v2 的 pool 的實現之前,我選擇了自己實現一個 Redis pool。(這里,就不貼代碼了。後來發現自己實現的 Redis pool 與 Radix.v2 實現的 Redis pool 的原理是一樣的,都是基於 channel 實現的, 遇到的問題也是一樣的。)
不過在測試過程中,發現了一個詭異的問題。在請求過程中經常會報 EOF 錯誤。而且是概率性出現,一會有問題,一會又好了。通過反復的測試,發現 bug 是有規律的,當程序空閑一會後,再進行連續請求,會發生3次失敗,然後之後的請求都能成功,而我的連接池大小設置的是3。再進一步分析,程序空閑300秒 後,再請求就會失敗,發現我的 Redis server 配置了 timeout 300,至此,問題就清楚了。是連接超時 Redis server 主動斷開了連接。客戶端這邊從一個超時的連接請求就會得到 EOF 錯誤。
然後我看了一下 Radix.v2 的 pool 包的源碼,發現這個庫本身並沒有檢測壞的連接,並替換為新server{location/pool{content_by_lua_block{localredis=require"resty.redis"localred=redis:new()localok,err=red:connect("127.0.0.1",6379)ifnotokthenngx.say("failedtoconnect:",err)returnendok,err=red:set("hello","world")ifnotokthenreturnendred:set_keepalive(10000,100)}}}
發現有個 set_keepalive 的方法,查了一下官方文檔,方法的原型是 syntax: ok, err = red:set_keepalive(max_idle_timeout, pool_size) 貌似 max_idle_timeout 這個參數,就是我們所缺少的東西,然後進一步跟蹤源碼,看看裡面是怎麼保證連接有效的。
function_M.set_keepalive(self,...)localsock=self.sockifnotsockthenreturnnil,"notinitialized"endifself.subscribedthenreturnnil,"subscribedstate"endreturnsock:setkeepalive(...)end
至此,已經清楚了,使用了 tcp 的 keepalive 心跳機制。
於是,通過與 Radix.v2 的作者一些討論,選擇自己在 redis 這層使用心跳機制,來解決這個問題。
四、最後的解決方案
在創建連接池之後,起一個 goroutine,每隔一段 idleTime 發送一個 PING 到 Redis server。其中,idleTime 略小於 Redis server 的 timeout 配置。連接池初始化部分代碼如下:
p,err:=pool.New("tcp",u.Host,concurrency)errHndlr(err)gofunc(){for{p.Cmd("PING")time.Sleep(idelTime*time.Second)}}()
使用 redis 傳輸數據部分代碼如下:
funcredisDo(p*pool.Pool,cmdstring,args...interface{})(reply*redis.Resp,errerror){reply=p.Cmd(cmd,args...)iferr=reply.Err;err!=nil{iferr!=io.EOF{Fatal.Println("redis",cmd,args,"erris",err)}}return}
其中,Radix.v2 連接池內部進行了連接池內連接的獲取和放回,代碼如下:
//,executesthegivencommand//(returningitsresult),(p*Pool)Cmd(cmdstring,args...interface{})*redis.Resp{c,err:=p.Get()iferr!=nil{returnredis.NewResp(err)}deferp.Put(c)returnc.Cmd(cmd,args...)}
這樣,我們就有了 keepalive 的機制,不會出現 timeout 的連接了,從 redis 連接池裡面取出的連接都是可用的連接了。看似簡單的代碼,卻完美的解決了連接池裡面超時連接的問題。同時,就算 Redis server 重啟等情況,也能保證連接自動重連。