【本地启动】 cd 进入到解压的主目录 输入 redis-server.exe redis.windows.conf 打开服务 cd 进入到解压的主目录 输入 redis-cli.exe 打开客户端 链接服务器 redis-cli.exe -h 192.168.2.92 -p 6379 要在主目录下才可以 连接redis 不需要 用户名和密码 可以自行设定 【登录linux下的redis】 [root@sh-192-168-0-227 bin]# ps -ef|grep redis root 3063 1 0 Jun15 ? 00:18:34 /usr/local/bin/redis-server *:6379 root 17894 14186 0 14:21 pts/4 00:00:00 grep redis [root@sh-192-168-0-227 bin]# cd /usr/local/bin/ [root@sh-192-168-0-227 bin]# ./redis-cli 127.0.0.1:6379> dbsize (integer) 27226 127.0.0.1:6379> ping PONG 127.0.0.1:6379> 在当期目录下 连接服务 ./redis-cli -h 192.168.100.34 -p 6379 192.168.100.34:6379> CONFIG SET requirepass "mypass" # 设置密码 redis> CONFIG SET requirepass secret_password # 将密码设置为 secret_password OK redis> QUIT # 退出再连接,让新密码对客户端生效 [huangz@mypad]$ redis redis> PING # 未验证密码,操作被拒绝 (error) ERR operation not permitted redis> AUTH wrong_password_testing # 尝试输入错误的密码 (error) ERR invalid password redis> AUTH secret_password # 输入正确的密码 OK redis> PING # 密码验证成功,可以正常操作命令了 PONG # 清空密码 redis> CONFIG SET requirepass "" # 通过将密码设为空字符来清空密码 OK redis> QUIT $ redis # 重新进入客户端 redis> PING # 执行命令不再需要密码,清空密码操作成功 PONG 移动数据库里面的数据 select 0-15 选择数据库 select 0 set age 20 get age 20 move age 1 (integer)1已经移除成功 select 1 get age 20 expire age 300过期时间 ttl age 查看过期时间 移除过期时间persist age ping 测试连接是否存活 PONG quit 退出客户端 info 服务器信息 multi保存队列在里面 exec依次执行命令 discard取消队列里面所有的命令(事务回滚) RDB持久化 命令SAVE BGSAVE(会派生好出一个子进程,然后由子进程负责创建RDB 文件,父进程继续处理命令请求) 登陆表redis数据 Redis命令总结 keys * 取出当前匹配的所有key 如 : keys hq:0* > exists larry (integer) 0 当前的key是否存在 del lv 删除当前key expire 设置过期时间 > move larry ad4 (integer) 1 移动larry键值对到ad4数据库 > persist lv (integer) 1 移除当前key的过期时间 randomkey 随机返回一个key rename 重命名key type 返回值的数据类型 type testlist list > ping PONG 测试连接是否还在 >echo name "larry" 打印 > select ad4databank OK 数据库切换 当前数据库中key的数量 > info 服务器基本信息 连接操作相关的命令 quit:关闭连接(connection) auth:简单密码认证 持久化 save:将数据同步保存到磁盘 bgsave:将数据异步保存到磁盘 lastsave:返回上次成功将数据保存到磁盘的Unix时戳 shundown:将数据同步保存到磁盘,然后关闭服务 远程服务控制 info:提供服务器的信息和统计 monitor:实时转储收到的请求 slaveof:改变复制策略设置 config:在运行时配置Redis服务器 ===============================================================> 对value操作的命令 type(key): 返回值的类型 exists(key): 确认一个key是否存在 dbsize: 返回当前数据库中key的数目 del(key): 删除一个key keys(pattern):返回满足给定pattern的所有key randomkey: 随机返回key空间的一个 keyrename(oldname, newname):重命名key expire: 设定一个key的活动时间(s) ttl: 获得一个key的活动时间 select(index):按索引查询 move(key, dbindex):移动当前数据库中的key到dbindex数据库 flushdb: 删除当前选择数据库中的所有key flushall: 删除所有数据库中的所有key *********************************************【对String操作的命令】****************************************************** string是最简单的类型,一个Key对应一个Value。 string类型是二进制安全的,redis的string可以包含任何数据。 1. set(key, value):设置一个string类型的key和value(重复添加值会覆盖) 如: set name2 Tom 2. get(key):获取key对应的value值 如: get name2 3. getset(key, value):给名称为key的string赋予上一次的value 4. mget(key1, key2,…, key N):返回库中多个string的value 5. setnx(key, value):设置一个key的值string类型的value ,key值不存在则添加,key值存在则返回0: 如: set name com 6. setex(key, time, value):设置一个键值key的有效期time 如: setex col 7 red 7. setrange(key, value): 设置指定key的value值的子字符串: 8. strlen(key): 取指定key的value值的长度: 如:127.0.0.1:6379> strlen name 9. mset(key N, value N):一次设置多个key的值 10. mget (key1,key2,key3..) 一次获取多个key的值 如:127.0.0.1:6379> mset name tom age 25 sex man OK 127.0.0.1:6379> mget name age sex 1) "tom" 2) "25" 3) "man" 11. msetnx(key N, value N):设置多个value、不覆盖已存在的key: 如 127.0.0.1:6379> msetnx name tom age 25 sex man email tom13@163.com (integer) 1 127.0.0.1:6379> mget name age sex email 1) "tom" 2) "25" 3) "man" 4) "tom13@163.com" 12. getrange(key, 起始位置,结束位置) 如:127.0.0.1:6379> get name "ma.fenglei" 127.0.0.1:6379> getrange name 3 -1 "fenglei" 13. incr(key):对key的值做加加操作,并返回新的值 (类似于i++) 如:127.0.0.1:6379> get age "25" 127.0.0.1:6379> incr age (integer) 26 127.0.0.1:6379> incr age (integer) 27 14. incrby(key, integer):加指定值,key不存在设置key,并认为原来的值为0: 如:127.0.0.1:6379> get age "27" 127.0.0.1:6379> incrby age 5 (integer) 32 127.0.0.1:6379> incrby age 5 (integer) 37 15. decr(key):对key的值做减减操作: 如:127.0.0.1:6379> get age "37" 127.0.0.1:6379> decr age (integer) 36 127.0.0.1:6379> decr age (integer) 35 16. decrby(key, integer):同decr类似,减<指定值>: 如:127.0.0.1:6379> get age "35" 127.0.0.1:6379> decrby age 5 (integer) 30 127.0.0.1:6379> decrby age 5 (integer) 25 17. append(key, value):给指定的key的字符串追加value,返回新字符串值的长度: 如:127.0.0.1:6379> get name "fenglei" 127.0.0.1:6379> append name @qq.com (integer) 14 127.0.0.1:6379> get name "fenglei@qq.com" 18. substr(key, start, end):接取字符串 如:127.0.0.1:6379> get name "fenglei@qq.com" 127.0.0.1:6379> substr name 2 9 "nglei@qq" 127.0.0.1:6379> *********************************************【end】****************************************************************** *********************************************【对List操作的命令】****************************************************** list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等,操作中key理解为链表的名字。 1. lpush(key, value):在key对应list的头部添加字符串元素: 如:127.0.0.1:6379> lpush mylist world (integer) 1 127.0.0.1:6379> lpush mylist hello (integer) 2 127.0.0.1:6379> lrange mylist 0 -1 1) "hello" 2) "world" 127.0.0.1:6379> 2. rpush(key, value):在key对应list的尾部添加字符串元素: 如:127.0.0.1:6379> rpush mylist2 hello (integer) 1 127.0.0.1:6379> rpush mylist2 world (integer) 2 127.0.0.1:6379> lrange mylist2 0 -1 1) "hello" 2) "world" 3. lrange(key, start, end):返回名称为key的list中start至end之间的元素 如:127.0.0.1:6379> lrange mylist 0 -1 返回key为mylist的所有的值 4. llen(key):返回名称为key的list的长度 5. linsert 在key对应list的特定位置之前或之后添加字符串元素: 如:127.0.0.1:6379> lrange mylist3 0 -1 1) "hello" 2) "world" 127.0.0.1:6379> linsert mylist3 before world there (integer) 3 127.0.0.1:6379> lrange mylist3 0 -1 1) "hello" 2) "there" 3) "world" 6. ltrim(key, start, end):截取名称为key的list 如:127.0.0.1:6379> lrange mylist8 0 -1 1) "one" 2) "two" 3) "three" 4) "four" 127.0.0.1:6379> ltrim mylist8 1 -1 OK 127.0.0.1:6379> lrange mylist8 0 -1 1) "two" 2) "three" 3) "four" 7. lindex(key, index):返回名称为key的list中index位置的元素: 如:127.0.0.1:6379> lrange mylist5 0 -1 1) "foo]" 2) "hello" 127.0.0.1:6379> lindex mylist5 0 "foo]" 127.0.0.1:6379> lindex mylist5 1 "hello" 127.0.0.1:6379> 8. lset(key, index, value):设置list中指定下标的元素值(下标从0开始) 如:127.0.0.1:6379> lrange mylist4 0 -1 1) "one" 2) "two" 3) "three" 127.0.0.1:6379> lset mylist4 0 four OK 127.0.0.1:6379> lrange mylist4 0 -1 1) "four" 2) "two" 3) "three" 9. lrem(key, count, value):从key对应list中删除count个和value相同的元素。 count>0时,按从头到尾的顺序删除,count<0时,按从尾到头的顺序删除,count=0时,删除全部, 如:127.0.0.1:6379> lrange mylist5 0 -1 1) "hello" 2) "hello" 3) "foo]" 4) "hello" 127.0.0.1:6379> lrem mylist5 2 hello (integer) 2 127.0.0.1:6379> lrange mylist5 0 -1 1) "foo]" 2) "hello" 10. lpop 从list的头部删除元素,并返回删除元素: 如:127.0.0.1:6379> lrange mylist 0 -1 1) "five" 2) "world" 127.0.0.1:6379> lpop mylist "five" 127.0.0.1:6379> lrange mylist 0 -1 1) "world" 11. rpop(key):从list的尾部删除元素,并返回删除元素: blpop(key1, key2,… key N, timeout):lpop命令的block版本。 brpop(key1, key2,… key N, timeout):rpop的block版本。 rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部 *********************************************【end】****************************************************************** *********************************************【对set操作的命令】****************************************************** 对Set操作的命令 sadd(key, member):向名称为key的set中添加元素member srem(key, member) :删除名称为key的set中的元素member spop(key) :随机返回并删除名称为key的set中一个元素 smove(srckey, dstkey, member) :移到集合元素 scard(key) :返回名称为key的set的基数 sismember(key, member) :member是否是名称为key的set的元素 sinter(key1, key2,…key N) :求交集 sinterstore(dstkey, (keys)) :求交集并将交集保存到dstkey的集合 sunion(key1, (keys)) :求并集 sunionstore(dstkey, (keys)) :求并集并将并集保存到dstkey的集合 sdiff(key1, (keys)) :求差集 sdiffstore(dstkey, (keys)) :求差集并将差集保存到dstkey的集合 smembers(key) :返回名称为key的set的所有元素 srandmember(key) :随机返回名称为key的set的一个元素 *********************************************【对hash操作的命令】****************************************************** 查看 一个 192.168.0.227:6379> type "CG:USER:19842" hash 192.168.0.227:6379> hkeys "CG:USER:19842" 1) "usableDecks" 2) "id" 3) "battleDeck" 4) "nicknm" 5) "prepareHeros" 192.168.0.227:6379> hget "CG:USER:19842" "usableDecks" "{"0":{"1":1,"2":2,"4":1,"5":1,"6":1,"9":1,"11":1,"15":1,"18 ":2,"20":1,"22":2,"23":2,"24":1,"27":2,"30":2,"32":2,"33":1,"40 ":1,"44":1,"45":2,"47":2}}" 192.168.0.227:6379> redis.hset("hashs", "key001", "value001"); 对Hash操作的命令 这里key 为设置的键 1. hset(key, field, value):向名称为key的hash中添加元素field的值value, 如果哈希表中域字段已经存在且旧值已被新值覆盖 如:127.0.0.1:6379> hset myhash fp foo (integer) 1 127.0.0.1:6379> hget myhash fp "foo" 127.0.0.1:6379> hset myhash google www.google.com (integer) 1 127.0.0.1:6379> hkeys myhash 1) "fp" 2) "google" 2. hkeys(key): 获取哈希表中的所有的键。 如:127.0.0.1:6379> hset myhash field1 foo (integer) 1 127.0.0.1:6379> hset myhash field2 bar (integer) 1 127.0.0.1:6379> hkeys myhash 1) "field1" 2) "field2" 127.0.0.1:6379> hget myhash field2 "bar" 127.0.0.1:6379> 2. hget(key, field):返回名称为key的hash中field对应的value 3. hmset(key, (fields)):同时将多个 field-value (字段-值)对设置到哈希表中。 如: 127.0.0.1:6379> hmset myhash2 name tom age 28 OK 127.0.0.1:6379> hget myhash2 name "tom" 127.0.0.1:6379> hget myhash2 age "28" 4. hmget(key, (fields)):获取全部指定的hash field。 如:127.0.0.1:6379> hkeys myhash2 1) "name" 2) "age" 127.0.0.1:6379> hmget myhash2 name 1) "tom" 127.0.0.1:6379> hmget myhash2 name age 1) "tom" 2) "28" 127.0.0.1:6379> 5. hincrby(key, field, integer):将名称为key的hash中field的value增加integer 如:127.0.0.1:6379> hset user:002 age 29 (integer) 1 127.0.0.1:6379> hget user:002 age "29" 127.0.0.1:6379> hincrby user:002 age 5 (integer) 34 127.0.0.1:6379> hget user:002 age "34" 127.0.0.1:6379> hkeys user:002 1) "age" 6. hexists(key, field):测试指定field在hash中是否存在。返回1为存在,0为不存在 如:127.0.0.1:6379> hexists user:002 name (integer) 0 127.0.0.1:6379> hexists user:002 age (integer) 1 7. hdel(key, field):删除指定hash的field。 8. hlen(key):返回名称为key的hash中元素个数 9. hvals(key):返回hash的所有value。 如:127.0.0.1:6379> hvals user:002 1) "34" 2) "tom]" 127.0.0.1:6379> hkeys user:002 1) "age" 2) "name" 10. hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value 如:127.0.0.1:6379> hkeys user:002 1) "age" 2) "name" 127.0.0.1:6379> hgetall user:002 1) "age" 2) "34" 3) "name" 4) "tom]" Redis文件夹有以下几个文件 redis-server.exe:服务程序 redis-check-dump.exe:本地数据库检查 redis-check-aof.exe:更新日志检查 redis-benchmark.exe:性能测试,用以模拟同时由N个客户端发送M个 SETs/GETs 查询 (类似于 Apache 的ab 工具). 目前只用了 redis-server.exe,它是启动redis服务的,它在服务器上执行就可以了,我们可以写个BAT文件让它去执行autorunRedis.bat -------------------------------------------------------------------------------------------------------------------------------- package com.aug3.storage.redisclient.practice; import redis.clients.jedis.Jedis; import redis.clients.jedis.Pipeline; import java.util.*; /** * Created by fenglei.ma on 2018/3/30. 16:37 */ public class RedisTest1 { public static void main(String[] args) { Jedis redis = new Jedis("192.168.100.34", 6379); /* ----------------------------------------------------------------------------------------------------------- */ //KEYS 操作 Set keys = redis.keys("*");//列出所有的key,查找特定的key如:redis.keys("foo") Iterator t1 = keys.iterator(); while (t1.hasNext()) { Object obj1 = t1.next(); System.out.println(obj1); } //DEL 移除给定的一个或多个key。如果key不存在,则忽略该命令。 redis.del("name1"); //TTL 返回给定key的剩余生存时间(time to live)(以秒为单位) redis.ttl("foo"); //PERSIST key 移除给定key的生存时间。 redis.persist("foo"); //EXISTS 检查给定key是否存在。 redis.exists("foo"); //MOVE key db 将当前数据库(默认为0)的key移动到给定的数据库db当中。如果当前数据库(源数据库)和给定数据库(目标数据库)有相同名字的给定key,或者key不存在于当前数据库,那么MOVE没有任何效果。 redis.move("foo", 1);//将foo这个key,移动到数据库1 //RENAME key newkey 将key改名为newkey。当key和newkey相同或者key不存在时,返回一个错误。当newkey已经存在时,RENAME命令将覆盖旧值。 redis.rename("foo", "foonew"); //TYPE key 返回key所储存的值的类型。 System.out.println(redis.type("foo"));//none(key不存在),string(字符串),list(列表),set(集合),zset(有序集),hash(哈希表) //EXPIRE key seconds 为给定key设置生存时间。当key过期时,它会被自动删除。 redis.expire("foo", 5);//5秒过期 //EXPIREAT EXPIREAT的作用和EXPIRE一样,都用于为key设置生存时间。不同在于EXPIREAT命令接受的时间参数是UNIX时间戳(unix timestamp)。 //一般SORT用法 最简单的SORT使用方法是SORT key。 redis.lpush("sort", "1"); redis.lpush("sort", "4"); redis.lpush("sort", "6"); redis.lpush("sort", "3"); redis.lpush("sort", "0"); List list = redis.sort("sort");//默认是升序 for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } /* ----------------------------------------------------------------------------------------------------------- */ // STRING 操作 //SET key value将字符串值value关联到key。 redis.set("name", "wangjun1"); redis.set("id", "123456"); redis.set("address", "guangzhou"); //SETEX key seconds value将值value关联到key,并将key的生存时间设为seconds(以秒为单位)。 redis.setex("foo", 5, "haha"); //MSET key value [key value ...]同时设置一个或多个key-value对。 redis.mset("haha", "111", "xixi", "222"); //redis.flushAll();清空所有的key System.out.println(redis.dbSize());//dbSize是多少个key的个数 //APPEND key value如果key已经存在并且是一个字符串,APPEND命令将value追加到key原来的值之后。 redis.append("foo", "00");//如果key已经存在并且是一个字符串,APPEND命令将value追加到key原来的值之后。 //GET key 返回key所关联的字符串值 redis.get("foo"); //MGET key [key ...] 返回所有(一个或多个)给定key的值 List list2 = redis.mget("haha", "xixi"); for (int i = 0; i < list2.size(); i++) { System.out.println(list2.get(i)); } //DECR key将key中储存的数字值减一。 //DECRBY key decrement将key所储存的值减去减量decrement。 //INCR key 将key中储存的数字值增一。 //INCRBY key increment 将key所储存的值加上增量increment。 /* ----------------------------------------------------------------------------------------------------------- */ // Hash 操作 //HSET key field value将哈希表key中的域field的值设为value。 redis.hset("website", "google", "www.google.cn"); redis.hset("website", "baidu", "www.baidu.com"); redis.hset("website", "sina", "www.sina.com"); //HMSET key field value [field value ...] 同时将多个field - value(域-值)对设置到哈希表key中。 Map map = new HashMap(); map.put("cardid", "123456"); map.put("username", "jzkangta"); redis.hmset("hash", map); //HGET key field返回哈希表key中给定域field的值。 System.out.println(redis.hget("hash", "username")); //HMGET key field [field ...]返回哈希表key中,一个或多个给定域的值。 List list3 = redis.hmget("website", "google", "baidu", "sina"); for (int i = 0; i < list3.size(); i++) { System.out.println(list3.get(i)); } //HGETALL key返回哈希表key中,所有的域和值。 Map<String, String> map1 = redis.hgetAll("hash"); for (Map.Entry entry : map1.entrySet()) { System.out.print(entry.getKey() + ":" + entry.getValue() + " "); } //HDEL key field [field ...]删除哈希表key中的一个或多个指定域。 //HLEN key 返回哈希表key中域的数量。 //HEXISTS key field查看哈希表key中,给定域field是否存在。 //HINCRBY key field increment为哈希表key中的域field的值加上增量increment。 //HKEYS key返回哈希表key中的所有域。 //HVALS key返回哈希表key中的所有值。 /* ----------------------------------------------------------------------------------------------------------- */ // LIST 操作 //LPUSH key value [value ...]将值value插入到列表key的表头。 redis.lpush("list", "abc"); redis.lpush("list", "xzc"); redis.lpush("list", "erf"); redis.lpush("list", "bnh"); //LRANGE key start stop返回列表key中指定区间内的元素,区间以偏移量start和stop指定。下标(index)参数start和stop都以0为底,也就是说,以0表示列表的第一个元素,以1表示列表的第二个元素,以此类推。你也可以使用负数下标,以-1表示列表的最后一个元素,-2表示列表的倒数第二个元素,以此类推。 List list4 = redis.lrange("list", 0, -1); for (int i = 0; i < list4.size(); i++) { System.out.println(list4.get(i)); } //LLEN key返回列表key的长度。 //LREM key count value根据参数count的值,移除列表中与参数value相等的元素。 /* ----------------------------------------------------------------------------------------------------------- */ // SET 操作 //SADD key member [member ...]将member元素加入到集合key当中。 redis.sadd("testSet", "s1"); redis.sadd("testSet", "s2"); redis.sadd("testSet", "s3"); redis.sadd("testSet", "s4"); redis.sadd("testSet", "s5"); //SREM key member移除集合中的member元素。 redis.srem("testSet", "s5"); //SMEMBERS key返回集合key中的所有成员。 Set set = redis.smembers("testSet"); Iterator t12 = set.iterator(); while (t1.hasNext()) { Object obj1 = t12.next(); System.out.println(obj1); } //SISMEMBER key member判断member元素是否是集合key的成员。是(true),否则(false) System.out.println(redis.sismember("testSet", "s4")); } public void testredis() { System.out.println("start"); Jedis redis = new Jedis("192.168.100.34", 6379); Pipeline pipelined = redis.pipelined(); pipelined.set("test:key_569", "val1154564654653553"); pipelined.sync(); System.out.println("读取" + redis.get("test:key_569")); System.out.println(); String value = String.format("%s|%s|%s|%s|%s", new Object[]{"10:38:51", "12.36", "385234.0", "3832461.32", "10.03"}); pipelined.rpush("test:practice5", value); pipelined.sync(); System.out.println("写入数据完成"); System.out.println("读取" + redis.rpop("test:practice5")); System.out.println(); Map<String, String> ssMap = new HashMap<String, String>(); ssMap.put("name", "fangshijiu"); ssMap.put("address", "浦江镇"); ssMap.put("salary", "8000"); ssMap.put("age", "28"); pipelined.hmset("test:practice4", ssMap); pipelined.sync(); System.out.println("写入数据完成"); System.out.println("读取"); Map<String, String> stringStringMap = redis.hgetAll("test:practice4"); for (String key : stringStringMap.keySet()) { System.out.println(key + " : " + stringStringMap.get(key)); } System.out.println("end"); } }