1、redis 安裝 java
yum -y install cppnode
yum -y install binutilsredis
yum -y install glibc數據庫
yum -y install glibc-kernheadersapache
yum -y install glibc-common數組
yum -y install glibc-devel緩存
yum -y install gcc安全
yum -y install make性能優化
make 命令[root@node1 redis-3.0.0]# make服務器
make install 命令[root@node1 redis-3.0.0]# make install
cp redis/redis.conf /etc/
修改配置文件redis.conf
daemonize yes(後臺運行)
logfile 「/usr/local/java/redis-3.0.0/log」(日誌文件)
命令 redis-server /etc/redis.conf [--port 6379] 後臺啓動
命令 redis-cli [-h 127.0.0.1] [-p 6379]
redis-cli shutdown
得到符合規則的鍵名稱
keys 表達式(?,* ,[],\?) 如keys * 查看全部key的信息
判斷一個鍵是否存在
exists key 如exists aa 返回1表示key存在 0 表示key不存在
刪除鍵
del key 如del aa
del key1 key2
批量刪除
redis-cli del `redis-cli keys "key*"`
得到鍵值的數據類型type
返回值多是這五種類型(string,hash,list,set,zset)
注意:redis不區分命令大小寫
help @<group> 查看哪一種數據類型怎麼用的 如help @string
help <command> 查看哪一種命令怎麼用的 如 help set
quit 退去redis客戶端
set 存一個key value類型的數據 如set aa bb
get 根據key查詢value值 如get aa
setnx 表示若是該key存在就不覆蓋value
mset 一次存儲多個key value 如mset aa aa bb bb cc cc
mget 一次獲取多個key的value 如mget aa bb cc
incr 表示若是一個key的value的類型是數字 每執行一次incr命令該key的value的值就會自增1 如 incr aa
decr 表示若是一個key的value的類型是數字 每執行一次decr 命令該key的value的值就會自減1 如 decr aa
incrby 表示若是一個key的value的類型是數字 該key的value按照指定的數字增長 如incrby aa 10
decrby 表示若是一個key的value的類型是數字 該key的value按照指定的數字減小 如decrby aa 10
incrbyfloat 表示若是一個key的value的類型是數字 該key的value按照指定的小數增長如incrbyfloat aa 0.12
append 表示在value的後面拼接 如append aa 11
strlen 表示返回value的長度 如strlen aa
hset 存一個key key value類型的數據 如hset user1 name zs
hget 根據key下的key查詢value值 如hget user1 name
hmset 一次存儲多個key key value 如hmset user3 name lisi age 10 qita wu
hmget 一次取key下的多個key的value值如 hmget user3 name age love
hgetall 獲取key下的全部信息 如 hgetall user3
hsetnx 表示若是該key下key的value存在就不覆蓋value 如 hsetnx user3 name ww
hexists,判斷鍵中的屬性是否存在 如hexists user3 name
hincrby 表示若是一個key下key的value的類型是數字 該key的value按照指定的數字增長 如hincrby user3 age 10
hdel 刪除key下某個key的值 如hdel user3 age
hkeys 獲取key下的全部key的信息 如hkeys user3
hvals 獲取key下的全部value的值 如 hvals user3
hlen 獲取鍵中包含多少個key 如 hlen user3
lpush 從左面開始存一個key 多個 value類型的數據 如lpush list 1 2 3 4 5
rpush 從右面開始存一個key 多個 value類型的數據 如rpush list 1 2 3 4 5
lpop 每執行一次會從集合的左面刪除一條數據 如lpop list
rpop 每執行一次會從集合的右面刪除一條數據 如rpop list
llen 查看集合的長度 如llen list
lrange(-1表示最後一個元素的位置) 查看指定範圍的數據 如lrange list 0 -1
lrem(lrem key count value)count分爲三種狀況 如 lrem list 2 3
count > 0 : 從表頭開始向表尾搜索,移除與 value 相等的元素,數量爲 count 。
count < 0 : 從表尾開始向表頭搜索,移除與 value 相等的元素,數量爲 count 的絕對值。
count = 0 : 移除表中全部與 value 相等的值。
lindex 查詢指定角標數據 如lindex list 1
lset 修改指定腳標的數據 如 lset list 1 10
ltrim 截取指定腳標的數據 如ltrim list 0 1
linsert 向指定元素先後插入元素 如linsert list before2 3 或 linsert list after 2 3
rpoplpush:將元素從一個列表轉到另外一個列表 rpoplpush list list1
sadd 存一個key 多個value類型的數據 如sadd set1 1 2 3 4 5
smembers 獲取key的全部value信息 如smembers set1
srem 刪除key下的一個或多個value 如 srem set1 4
sismember 判斷key下的value存不存在 存在返回1不存在返回0 如sismember set1 1
sdiff 返回兩個集合中和第一個集合不一樣的元素 如sdiff set2 set1
sinter(交集) 返回兩個集合中相同的元素 如sinter set1 set2
sunion(並集) 返回兩個集合中全部不重複的元素 如 sunion set1 set2
sdiffstore 把兩個集合中和第一個集合不一樣的元素 保存到另外一個集合裏 如sdiffstore set3 set1 set2
sinterstore 把兩個集合中相同的元素保存到另外一個集合裏 如 sinterstore set4 set1 set2
sunionstore 把兩個集合中全部不重複的元素 保存到另外一個集合裏 如 sunionstore set4 set1 set2
scard 獲取集合長度 如scard set4
spop 隨機從集合中取出並刪除一個元素 如spop set4
srandmember key [count] 如 srandmember set2 10
若是 count 爲正數,且小於集合基數,那麼命令返回一個包含 count 個元素的數組,數組中的元素各不相同。若是 count 大於等於集合基數,那麼返回整個集合。
若是 count 爲負數,那麼命令返回一個數組,數組中的元素可能會重複出現屢次,而數組的長度爲 count 的絕對值
zadd 存一個key 多個value類型的數據 如zadd sort1 10 1 20 2 30 3 分值越大越靠後
zscore 得到某個value的分值是多少 如zscore sort1 1
zrange 查看指定範圍的數據 如zrange sort1 0 -1 (-1表示最後一個元素)
zrevrange 反向查看指定範圍的數據 如zrevrange sort1 0 -1 (-1表示最後一個元素)
zrangebyscore 經過分值查詢value(默認是閉區間,可以使用"("使用開區間) 如zrangebyscore sort1 8 (10
zincrby 給某個value按指定的數增長分值 如zincrby sort1 100 32
zcard 查看key下value的數量 如zcard sort1
zcount 獲取指定分數範圍的元素個數 如zcount sort1 10 20
zrem 刪除指定的value 如zrem sort1 33 34
zremrangebyrank 刪除指定範圍的數據 如zremrangebyrank sort1 0 -1
zremrangebyscore 刪除指定分數範圍內的數據 如zremrangebyscore sort 10 100
+inf(正無窮) 該value 排在最下面
-inf(負無窮) 該value 排在最上面
redis中可使用expire命令設置一個鍵的生存時間,到時間後redis會自動刪除它。
expire 設置生存時間(單位/秒) 如 expire sort1 10
pexpire設置生存時間(單位/毫秒) 如 pexpire sort1 1000
ttl 查看key還有多少秒過時 如ttl sort1
pttl 查看key還有多少毫秒秒過時 如pttl sort1
persist 取消生存時間 如persist sort1
expireat 指定一個時間戳到該時間戳後 key過時 如 expireat sort1 1351858600
pexpireat 指定一個時間戳(毫秒)到該時間戳後 key過時 如 expireat sort1 13518586000000
sort命令能夠對列表類型,集合類型和有序集合類型鍵進行排序。
sort key [desc] [limit offset count] 如sort list1 desc limit 0 3
by 參考鍵(參考鍵能夠是字符串類型或者是hash類型的某個字段,hash類型的格式爲:鍵名->字段名)
若是參考鍵中不帶*號則不排序
若是某個元素的參考鍵不存在,則默認參考鍵的值爲0
擴展 get參數
get參數的規則和by參數的規則同樣
get # (返回元素自己的值)
如 參考鍵是字符串 sort list1 by stu:* get # get stu:*
如 參考建是hash sort list1 by user:*->age get # get user:*->name
擴展 store參數
使用store 參數能夠把sort的排序結果保存到指定的列表中
如 sort list1 by stu:* get # get stu:* store list2
性能優化
1:儘量減小待排序鍵中元素的數量
2:使用limit參數只獲取須要的數據
3:若是要排序的數據數量很大,儘量使用store參數將結果緩存。
rdb方式的持久化是經過快照完成的,當符合必定條件時redis會自動將內存中的全部數據執行快照操做並存儲到硬盤上。默認存儲在redis根目錄的dump.rdb文件中。(文件名在配置文件中dbfilename)
redis進行快照的時機(在配置文件redis.conf中)
save 900 1:表示900秒內至少一個鍵被更改則進行快照。
save 300 10
save 60 10000
redis自動實現快照的過程,見備註
手動執行save或者bgsave命令讓redis執行快照。
兩個命令的區別在於,save是由主進程進行快照操做,會阻塞其它請求。bgsave是由redis執行fork函數複製出一個子進程來進行快照操做。
文件修復:redis-check-dump
rdb的優缺點
優勢:因爲存儲的有數據快照文件,恢復數據很方便。
缺點:會丟失最後一次快照之後更改的全部數據。
aof方式的持久化是經過日誌文件的方式。默認狀況下redis沒有開啓aof,能夠經過參數appendonly參數開啓。
appendonly yes
aof文件的保存位置和rdb文件的位置相同,都是dir參數設置的,默認的文件名是appendonly.aof,能夠經過appendfilename參數修改
appendfilename appendonly.aof
redis寫命令同步的時機
appendfsync always 每次都會執行
appendfsync everysec 默認 每秒執行一次同步操做(推薦,默認)
appendfsync no不主動進行同步,由操做系統來作,30秒一次
aof日誌文件重寫
auto-aof-rewrite-percentage 100(當目前aof文件大小超過上一次重寫時的aof文件大小的百分之多少時會再次進行重寫,若是以前沒有重寫,則以啓動時的aof文件大小爲依據)
auto-aof-rewrite-min-size 64mb
手動執行bgrewriteaof進行重寫
重寫的過程只和內存中的數據有關,和以前的aof文件無關。
所謂的「重寫」實際上是一個有歧義的詞語, 實際上, AOF 重寫並不須要對原有的 AOF 文件進行任何寫入和讀取, 它針對的是數據庫中鍵的當前值。
文件修復:redis-check-aof
動態切換redis持久方式,從 RDB 切換到 AOF(支持Redis 2.2及以上)
CONFIG SET appendonly yes
CONFIG SET save ""(可選)
注意:當redis啓動時,若是rdb持久化和aof持久化都打開了,那麼程序會優先使用aof方式來恢復數據集,由於aof方式所保存的數據一般是最完整的。
注意:若是想把正在運行的redis數據庫,從 RDB切換到AOF,建議先使用動態切換方式,再修改配置文件,重啓數據庫。(不能本身修改配置文件,重啓數據庫,不然數據庫中數據就爲空了。)
使用config set能夠動態設置參數信息,服務器重啓以後就失效了。
config set appendonly yes
config set save "90 1 30 10 60 100"
使用config get能夠查看全部可使用config set命令設置的參數
config get *
使用config rewrite命令對啓動 Redis 服務器時所指定的 redis.conf 文件進行改寫(Redis 2.8 及以上版本纔可使用),主要是把使用config set動態指定的命令保存到配置文件中。
config rewrite
注意:config rewrite命令對 redis.conf 文件的重寫是原子性的, 而且是一致的: 若是重寫出錯或重寫期間服務器崩潰, 那麼重寫失敗, 原有 redis.conf 文件不會被修改。 若是重寫成功, 那麼 redis.conf 文件爲重寫後的新文件。
設置數據庫密碼
修改配置requirepass password
驗證密碼auth password
注意:在配置redis複製功能的時候若是主數據庫設置了密碼,須要在從數據的配置文件中經過masterauth參數設置主數據庫的密碼,這樣從數據庫在鏈接主數據庫時就會自動使用auth命令認證了。至關於作了一個免密碼登陸。
bind參數(可讓數據庫只能在指定IP下訪問)
bind 127.0.0.1
命令重命名
修改命令的名稱rename-command flushall cleanall
禁用命令 rename-command flushall ""
package cn.crxy.redis.test8;
import static org.junit.Assert.*;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.junit.Test;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisSentinelPool;
import redis.clients.jedis.Pipeline;
import redis.clients.jedis.SortingParams;
import redis.clients.jedis.Transaction;
public class RedisTest {
String host = "192.168.1.170";
int port = 6379;
Jedis jedis = new Jedis(host, port);
/**
* 單機單連接方式
* 使用java代碼操做redis
* 通常只用於測試代碼
* @throws Exception
*/
@Test
public void test1() throws Exception {
jedis.set("aa", "11");
String string = jedis.get("aa");
System.out.println(string);
}
/**
* 單機鏈接池方式
* @throws Exception
*/
@Test
public void test2() throws Exception {
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(100);//總鏈接數
poolConfig.setMaxIdle(10);//空閒連接數
poolConfig.setMaxWaitMillis(3000);//建立鏈接的超時時間
poolConfig.setTestOnBorrow(true);//在建立鏈接的時候是否會測試
JedisPool jedisPool = new JedisPool(poolConfig, host, port);
Jedis jedis = jedisPool.getResource();
String string = jedis.get("aa");
System.out.println(string);
jedisPool.returnResourceObject(jedis);
}
/**
* 限制用戶訪問頻率
* @throws Exception
*/
@Test
public void test3() throws Exception {
for(int i=0;i<20;i++){
boolean checkLogin = checkLogin("192.168.1.1");
System.out.println(checkLogin);
}
}
public boolean checkLogin(String ip){
String value = jedis.get(ip);
if(value==null){
jedis.set(ip, 0+"");
jedis.expire(ip, 60);
}else{
int parseInt = Integer.parseInt(value);
if(parseInt>=10){
System.out.println("訪問受限。。。。");
return false;
}
}
jedis.incr(ip);
return true;
}
@Test
public void test4() throws Exception {
String value = jedis.get("aa");
System.out.println("休息一會。。。");
Thread.sleep(5000);
Transaction multi = jedis.multi();
int parseInt = Integer.parseInt(value);
parseInt++;
multi.set("aa", parseInt+"");
List<Object> exec = multi.exec();
System.err.println(exec);
}
@Test
public void test5() throws Exception {
jedis.watch("aa");
jedis.unwatch();
String value = jedis.get("aa");
System.out.println("休息一會。。。");
Thread.sleep(5000);
Transaction multi = jedis.multi();
int parseInt = Integer.parseInt(value);
parseInt++;
multi.set("crxy", parseInt+"");
List<Object> exec = multi.exec();
if(exec==null||exec.size()==0){
System.err.println("值被修改,執行失敗");
test5();
}
}
@Test
public void test6() throws Exception {
Jedis jedis2 = RedisUtils.getJedis();
String string = jedis2.get("aa");
System.out.println(string);
RedisUtils.returnJedis(jedis2);
}
@Test
public void test7() throws Exception {
SortingParams sortingParameters;
}
@Test
public void test8() throws Exception {
long starttime = System.currentTimeMillis();
for(int i=0;i<1000;i++){
jedis.set("x"+i, i+"");
}
System.out.println(System.currentTimeMillis()-starttime);
}
@Test
public void testtest9() throws Exception {
long starttime = System.currentTimeMillis();
Pipeline pipelined = jedis.pipelined();
for(int i=0;i<1000;i++){
pipelined.set("y"+i, i+"");
}
List<Object> syncAndReturnAll = pipelined.syncAndReturnAll();
pipelined.close();
System.out.println(System.currentTimeMillis()-starttime);
}
@Test
public void testSentinel() throws Exception {
Set<String> sentinels = new HashSet<String>();
sentinels.add("192.168.1.170:26379");
sentinels.add("192.168.1.171:26379");
JedisPoolConfig poolConfig = new JedisPoolConfig();
//TODO--
JedisSentinelPool jedisSentinelPool = new JedisSentinelPool("mymaster", sentinels, poolConfig );
HostAndPort currentHostMaster = jedisSentinelPool.getCurrentHostMaster();
System.out.println(currentHostMaster.getHost()+"--"+currentHostMaster.getPort());
Jedis jedisres = jedisSentinelPool.getResource();
String value = jedisres.get("aa");
System.out.println(value);
}
@Test
public void testCluster() throws Exception {
Set<HostAndPort> nodes = new HashSet<HostAndPort>();
nodes.add(new HostAndPort("192.168.1.170", 7000));
nodes.add(new HostAndPort("192.168.1.170", 7001));
nodes.add(new HostAndPort("192.168.1.170", 7002));
nodes.add(new HostAndPort("192.168.1.170", 7003));
nodes.add(new HostAndPort("192.168.1.170", 7004));
nodes.add(new HostAndPort("192.168.1.170", 7005));
JedisPoolConfig poolConfig = new JedisPoolConfig();
//TODO--
JedisCluster jedisCluster = new JedisCluster(nodes, poolConfig );
String string = jedisCluster.get("aa");
System.out.println(string);
}
}