资讯专栏INFORMATION COLUMN

Redis使用与实践

suemi / 749人阅读

什么是Redis

redis是远程的;
redis是基于内存的;
redis是非关系型数据库
优点:
1.支持丰富的数据类型:String,List,Set,Sorted Set,Hash等
2.支持两种数据持久化方式:Snapshotting(内存快照)和Append-Only file(日志追加)
3.支持主从复制

Redis的应用场景

缓存
队列--使用list结构
数据存储

Redis桌面管理工具

redis-desktop-manager

Redis数据类型
数据类型 存储的值 读写能力
String 可以是字符串,整数或浮点,统称为元素 对字符串操作,对整数类型加减
List 一个序列集合且每个节点都包好了一个元素 序列两端推入或弹出元素 修剪,查找或移除元素
Set 各个不同的元素 从集合中插入或删除元素
Hash 有key-value的散列组,其中key是字符串,value是元素 按照key进行增加删除
Sort Set 带分数的score-value有序集合,其中score是浮点,value为元素 集合插入,按照分数范围查找

String类型

key value(string/int/float)
127.0.0.1:6379> set string1 demo
OK
127.0.0.1:6379> get string1
"demo"
127.0.0.1:6379> set string2 4
OK
127.0.0.1:6379> get string2
"4" 
127.0.0.1:6379> incr string2 #对整型进行自增操作
(integer) 5
127.0.0.1:6379> get string2
"5"
127.0.0.1:6379> decrby string2 2 #对整型进行减法操作,将string2减去2
(integer) 3
127.0.0.1:6379> get string2
"3"

List类型

127.0.0.1:6379> lpush list1 12 #lpush表示从左边push一个元素到list1中,l表示left
(integer) 1
127.0.0.1:6379> lpush list1 13
(interger) 2
127.0.0.1:6379> rpop list1  #rpop表示从右侧pop出一个元素,按照先入先出的原则
“12”
127.0.0.1:6379> lpush list2 12
(integer) 1
127.0.0.1:6379> lpush list2 13
(integer) 2
127.0.0.1:6379> lpush list2 13 #list类型不要求集合中的元素唯一,所以可以插入相同的元素,而set类型要求集合中元素必须唯一
(integer) 3
127.0.0.1:6379> llen list2 #llen命令列出list2中元素的个数
(integer) 3

Set类型

127.0.0.1:6379> sadd set1 12
(integer) 1
127.0.0.1:6379> scard set1 #用scard查看set1中的元素个数
(integer) 1
127.0.0.1:6379> sadd set1 13
(integer) 1
127.0.0.1:6379> sadd set1 13
(integer) 0
127.0.0.1:6379> scard set1
(integer) 2
127.0.0.1:6379> sismember set1 13 #sismember 命令判断13是否在set1中
(integer) 1
127.0.0.1:6379> srem set1 13  #srem命令将13从set1中删除
(integer) 1
127.0.0.1:6379> sismember set1 13 
(integer) 0

Hash类型

127.0.0.1:6379> hset hash1 key1 12 #hset命令设置hash1的键为key1,值为12
(integer) 1
127.0.0.1:6379>  hget hash1 key1 #hget命令获取hash1键名为key1的值
"12"
127.0.0.1:6379> hset hash1 key2 13
(integer) 1
127.0.0.1:6379> hset hash1 key3 13
(integer) 1
127.0.0.1:6379> hlen hash1 #hlen命令获取hash1的长度
(integer) 3
127.0.0.1:6379> hset hash1 key3 14 #直接修改hash1中key3的值
(integer) 0
127.0.0.1:6379>  hget hash1 key3
"14"
127.0.0.1:6379>  hmget hash1 key1 key2  #hmget 命令一次获取多个key的值
1) "12"
2) "13"

Sort Set类型

127.0.0.1:6379> zadd zset1 10.1 val1  #zadd命令往zset1中添加一个元素,score为10.1,value为val1
(integer) 1
127.0.0.1:6379> zadd zset1 11.2 val2
(integer) 1
127.0.0.1:6379> zadd zset1 9.1 val3
(integer) 1
127.0.0.1:6379> zcard zset1  #zcard 命令查看zset1中的元素值
(integer) 3
127.0.0.1:6379> zrange zset1 0 2 withscores #zrange 命令打印出排名
1) "val3"
2) "9.1"
3) "val1"
4) "10.1"
5) "val2"
6) "11.19999999"
127.0.0.1:6379> zrange zset1 val2 #打印出val2的排名
(integer) 2
127.0.0.1:6379> zadd zset1 12.2 val3
(integer) 0
127.0.0.1:6379> zrange zset1 0 2 withscores
1) "val1"
2) "10.1"
3) "val2"
4) "11.19999999"
5) "val3"
6) "12.19999999"
127.0.0.1:6379> zadd zset1 12.2 val2
(integer) 0
127.0.0.1:6379> zrange zset1 0 2 withscores
1) "val1"
2) "10.1"
3) "val2"
4) "12.19999999"
5) "val3"
6) "12.19999999"
常用命令

键值相关命令

 // 1. keys *,代表取出所有的 key
 redis 127.0.0.1:6379> keys *
1) "myzset2"
2) "myzset3"
3) "mylist"
4) "myset2"
5) "myset3"
6) "myset4"
7) "k_zs_1"
8) "myset5"
9) "myset6"
10) "myset7"
11) "myhash"
12) "myzset"
13) "age"
14) "myset"
15) "mylist5"
16) "mylist6"
redis 127.0.0.1:6379> keys mylist*
1) "mylist"
2) "mylist5"
3) "mylist6"
4) "mylist7"
5) "mylist8"
redis 127.0.0.1:6379>
// 2.exists 确认一个 key 是否存在
redis 127.0.0.1:6379> exists HongWan
(integer) 0
redis 127.0.0.1:6379> exists age
(integer) 1
redis 127.0.0.1:6379>
// 3. del 删除一个 key
redis 127.0.0.1:6379> del age
(integer) 1
redis 127.0.0.1:6379> exists age
(integer) 0
redis 127.0.0.1:6379>
// 4. expire 设置一个 key 的过期时间(单位:秒)
redis 127.0.0.1:6379> expire addr 10
(integer) 1
redis 127.0.0.1:6379> ttl addr
(integer) 8
redis 127.0.0.1:6379> ttl addr
(integer) 1
redis 127.0.0.1:6379> ttl addr
(integer) -1
// 们设置 addr 这个 key 的过期时间是 10 秒,然后我们不断的用 ttl 来获取这个 key 的有效时长,直至为-1 说明此值已过期
// 5. move将当前数据库中的 key 转移到其它数据库中
redis 127.0.0.1:6379> select 0
www.ChinaDBA.net 中国 DBA 超级论坛
49
OK
redis 127.0.0.1:6379> set age 30
OK
redis 127.0.0.1:6379> get age
"30"
redis 127.0.0.1:6379> move age 1
(integer) 1
redis 127.0.0.1:6379> get age
(nil)
redis 127.0.0.1:6379> select 1
OK
redis 127.0.0.1:6379[1]> get age
"30"
redis 127.0.0.1:6379[1]>
// 先显式的选择了数据库 0,然后在这个库中设置一个 key,接下来我们将这个key 从数据库 0 移到数据库 1,之后我们确认在数据库 0 中无此 key 了, 但在数据库 1 中存在这个key,说明我们转移成功了
// 6. persist 移除给定 key 的过期时间
redis 127.0.0.1:6379[1]> expire age 300
(integer) 1
redis 127.0.0.1:6379[1]> ttl age
(integer) 294
redis 127.0.0.1:6379[1]> persist age
(integer) 1
redis 127.0.0.1:6379[1]> ttl age
(integer) -1
redis 127.0.0.1:6379[1]>
// 手动的将未到过期时间的 key,成功设置为过期
// 7. randomkey 随机返回 key 空间的一个 key
redis 127.0.0.1:6379> randomkey
"mylist7"
redis 127.0.0.1:6379> randomkey
"mylist5"
redis 127.0.0.1:6379>
// 8. rename 重命名 key
redis 127.0.0.1:6379[1]> keys *
1) "age"
redis 127.0.0.1:6379[1]> rename age age_new
OK
redis 127.0.0.1:6379[1]> keys *
1) "age_new"
// 9.  type 返回值的类型
redis 127.0.0.1:6379> type addr
string
redis 127.0.0.1:6379> type myzset2
zset
redis 127.0.0.1:6379> type mylist
list

服务器相关命令

// 1. ping 测试连接是否存活
redis 127.0.0.1:6379> ping
PONG
// 2. echo 在命令行打印一些内容
redis 127.0.0.1:6379> echo Helloworld
"Helloworld"
// 3. select 选择数据库。Redis 数据库编号从 0~15,我们可以选择任意一个数据库来进行数据的存取。
redis 127.0.0.1:6379> select 1
OK
redis 127.0.0.1:6379[1]> select 16
(error) ERR invalid DB index
redis 127.0.0.1:6379[16]>
// 4. quit 退出连接
redis 127.0.0.1:6379> quit
[root@localhost redis-2.2.12]#
// 5.  dbsize 返回当前数据库中 key 的数目
redis 127.0.0.1:6379> dbsize
(integer) 18
redis 127.0.0.1:6379>
// 6.  info 获取服务器的信息和统计
redis 127.0.0.1:6379> info
# Server
redis_version:3.2.100
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:dd26f1f93c5130ee
redis_mode:standalone
os:Windows
arch_bits:64
multiplexing_api:WinSock_IOCP
process_id:2528
.
.
redis 127.0.0.1:6379>
// 7. config get  获取服务器配置信息, config get * 表示获取全部
redis 127.0.0.1:6379> config get dir
1) "dir"
2) "/root/4setup/redis-3.2.100"
redis 127.0.0.1:6379>
// 8. flushdb 删除当前选择数据库中的所有 key
redis 127.0.0.1:6379> dbsize
(integer) 18
redis 127.0.0.1:6379> flushdb
OK
redis 127.0.0.1:6379> dbsize
(integer) 0
// 9. flushall 删除所有数据库中的所有 key
redis 127.0.0.1:6379[1]> dbsize
(integer) 1
redis 127.0.0.1:6379[1]> select 0
OK
redis 127.0.0.1:6379> flushall
OK
redis 127.0.0.1:6379> select 1
OK
redis 127.0.0.1:6379[1]> dbsize
(integer) 0
redis 127.0.0.1:6379[1]>
PHP操作Redis

String类型

//普通set/get操作
$redis->set("library", "predis");
$retval = $redis->get("library");
echo $retval; //显示 "predis"
 echo "
"; //setex set一个存储时效 $redis->setex("str", 10, "bar"); //表示存储有效期为10秒 echo $redis->get("str"); //setnx/msetnx相当于add操作,不会覆盖已有值 var_dump($redis->setnx("foo",12)); //true var_dump($redis->setnx("foo",34)); //foo已经存在,无法覆盖,所以返回false //getset操作,set的变种,结果返回替换前的值 echo $redis->getset("foo",56);//返回12 echo $redis->get("foo");//返回56 echo "
"; // incrby/incr/decrby/decr 对值的递增和递减 echo $redis->incr("foo"); //foo为57 echo $redis->incrby("foo",2); //foo为59 echo "
"; //exists检测是否存在某值 var_dump($redis->exists("foo"));//true //del 删除 var_dump($redis->del("foo"));//true echo $redis->get("foo");//空 //type 类型检测,字符串返回string,列表返回 list,set表返回set/zset,hash表返回hash var_dump($redis->type("foo"));//不存在,返回0 $redis->set("str","test"); //append 连接到已存在字符串 $redis->append("str","_123"); //返回累加后的字符串长度8,此进str为 "test_123" echo $redis->get("str"); //test_123 echo "
"; //substr 部分获取操作 echo $redis->substr("str",0,2);//表示从第0个起,取到第2个字符,共3个,返回"tes" //strlen 获取字符串长度 echo $redis->strlen("str"); //str为test_123,字符长度为8 //setbit/getbit 位存储和获取 echo $redis->setbit("binary",31,1); //表示在第31位存入1,这边可能会有大小端问题?不过没关系,getbit 应该不会有问题 echo $redis->getbit("binary",31); //返回1 //keys 模糊查找功能,支持*号以及?号(匹配一个字符) $redis->set("foo1",123); $redis->set("foo2",456); print_r($redis->keys("foo*")); //返回Array ( [0] => foo1 [1] => foo2 ) print_r($redis->keys("f?o?")); //同上Array ( [0] => foo1 [1] => foo2 ) //randomkey 随机返回一个key echo $redis->randomkey(); //可能是返回 "foo1"或者是"foo2"及其它任何一存在redis的key //rename/renamenx 对key进行改名,所不同的是renamenx不允许改成已存在的key $redis->rename("str","str2"); //把原先命名为"str"的key改成了"str2" //expire 设置key-value的时效性,ttl 获取剩余有效期,persist 重新设置为永久存储 $redis->expire("foo", 1); //设置有效期为1秒 $redis->ttl("foo"); //返回有效期值1s echo "
"; //dbsize 返回redis当前数据库的记录总数 echo $redis->dbsize();

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25658.html

相关文章

  • (学习到实践)五、docker搭建redis主从实践

    摘要:前面容器重建后需要重新运行命令绑定关联,需要命令行下生效。直接同步成功,在查看关系均有对方信息。是否要守护进程这里是经过多次测试,发现容器重启,也会正常启动。哨兵的配置于此类似,略过。 前面mysql容器重建后需要重新运行 change master to 命令绑定关联,8.0需要命令行下生效。redis首先想到用官方的,没想到进去各个基本shell命令无法使用,所以先弃了。这次由于官...

    Pocher 评论0 收藏0
  • (全栈学习实践)四、docker搭建redis主从实践

    摘要:前面容器重建后需要重新运行命令绑定关联,需要命令行下生效。直接同步成功,在查看关系均有对方信息。是否要守护进程这里是经过多次测试,发现容器重启,也会正常启动。哨兵的配置于此类似,略过。 前面mysql容器重建后需要重新运行 change master to 命令绑定关联,8.0需要命令行下生效。redis首先想到用官方的,没想到进去各个基本shell命令无法使用,所以先弃了。这次由于官...

    wall2flower 评论0 收藏0
  • 【推荐】最新200篇:技术文章整理

    摘要:作为面试官,我是如何甄别应聘者的包装程度语言和等其他语言的对比分析和主从复制的原理详解和持久化的原理是什么面试中经常被问到的持久化与恢复实现故障恢复自动化详解哨兵技术查漏补缺最易错过的技术要点大扫盲意外宕机不难解决,但你真的懂数据恢复吗每秒 作为面试官,我是如何甄别应聘者的包装程度Go语言和Java、python等其他语言的对比分析 Redis和MySQL Redis:主从复制的原理详...

    BicycleWarrior 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<