Redis数据库操作---包括搭建集群(上)

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,标准版 2GB
推荐场景:
搭建游戏排行榜
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: Redis数据库操作---包括搭建集群(上)

1.Redis简介

   Redis是一种数据库。能够存储数据、管理数据的一种软件

2.数据库应用历史:

           关系型数据库(表,一个表里面放的数据有限,所以要不断的分表)

   (1)单机数据库时代:一个应用,一个数据库实例

   (2)缓存、水平切分时代:

   (3)读写分离时代:

   (4)分表分库时代(集群):

   -----------------------------------------------------------------数据量越来越大,并发访问越来越多

       非关系型数据库(Nosql)(关系型数据库存取数量有限,连接速度太慢)

       (种类:redis、mongoDB、HBase......)        

   彻底改变底层存储机制。采用聚合数据结构存储数据(不再用表-关系数据模型存储数据)

3.Nosql数据模型:

   关系型数据库:表

   非关系型数据库:聚合模型----把一组相关联的数据作为一个整体进行存储和管理

       BSON:数据保存到键值对中、数据和数据之间用逗号隔开,{ }表示对象, [ ]表示数组

           {

               id:1001,

               name:zhengsan,

               age:20,

               class:{

                   id:111,

                   name:class1

                   }

           }

           {

               id:1002,

               name:lisi,

               age:21,

               class:{

                   id:111,

                   name:class1

                   }

           

           }

           K-V键值对、列簇、图表模型等

           Redis采用的是k-v模型存储数据的。

------------------------------------------------------------------------------------------------------------------

4.Redis:Remote Dictionary Server(远程字典服务器)      C、开源的、基于内存运行    【字典--强调索引】

   Redis中的数据大部分时间都是存储在内存中并且支持持久化,所以效率高,不能存储大量的数据。

   【适合存储:频繁访问、数据量比较小的数据】---也叫缓存数据库

特点:

1 支持数据持久化【Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用】

2 支持多种数据结构【Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储】

3 支持数据备份【Redis支持数据备份,即master-slave模式的数据备份】

=================================================================

5.Redis安装

   5.0.2版本

==================================================================

6.前台启动----- redis-server

  后台启动----- redis-server&

  启动redis服务时,指定配置文件redis-server redis.conf &

===================================================================

7.关闭Redis服务:

   1)通过kill命令

       ps -ef|grep redis查看pid

       kill -9 pid

   2)通过redis-cli shutdown

===================================================================

8.Redis客户端:用来连接redis服务,向redis服务端发送命令,并且显示redis服务处理结果。

   redis-cli: redis自带的客户端,使用命令redis-cli就可以启动redis客户端程序。

   

   redis-cli:            默认连接127.0.0.1(本机)上的6379端口的redis服务

   redis-cli -p 端口号:    连接127.0.0.1(本机)上的指定端口号的redis服务

   redis-cli -h ip地址 -p 端口号:连接指定ip主机上的指定端口的redis服务

9.退出客户端:exit

================================================================

10.redis基本命令

   1).测试redis服务性能:

       redis-benchmark

   2).查看redis服务是否正常进行--- 如果正常返回PONG

       ping

   3).查看redis服务器的统计信息:

       info            查看redis服务的所有统计信息

       info [信息段]        查看redis指定的统计信息    eg:info Replication

   4).Redis的数据库实例:作用类似于Mysql的数据库实例,redis中的数据库实例只能由redis服务来创建和维护,

                开发人员不能修改和自行创建数据库实例。默认情况下,redis会自动创建16个数据库实例,并且这些数据库实例进行编号,

                这些编号从0开始,一直到15,使用时通过编号来使用数据库;可以通过配置文件,指定redis自动创建的数据库;

                redis的每一个数据库实例本身占用的存储空间时很少的,所以也不会造成存储空间的太多浪费。

                默认情况下,redis客户端连接的是0号库。可以使用select index切换数据库实例。

   5).查看当前数据库实例中所有key的数量:dbsize

   6).查看当前数据库实例中所有的key:keys *

   7).清空数据库实例:flushdb

   8).清空所有数据库实例:flushall

   9).查看redis中的配置信息:config get *

       查看redis中指定的配置信息:config get parameter

       

====================================================================

11.Redis的五种数据结构:

   程序是用来处理数据的,Redis(数据库)是用来存储数据库的,程序处理完的数据要存储到redis中,不同特点的

   数据要存储在redis中不同类型的数据结构中。

       字符串(512MB),                    string -->单key:单value->  username:zhengsan 、age:20

       list列表(一条信息中,有多个有序的数据),            list      -->单key:多主有序value(按放入的顺序)->  contacts:133000,xxx,xxx    

       set集合(一条信息中,有多个无序无重复的数据)            set   -->单key:多个无序value->city:beijing shanghai nanchang  

        pojo:(存储一个实体类对象)                    hash(哈稀表)-->单个key:对象(属性:值)->student:id:1001,name:zhengsan,age:20

        有序集合(关联一个分数,按分数排序)                zset-->单个key:多有序value(相对于参考值)-->city:1500 sh,1000 tj,1200 cq,2000 bj(升序排)

==============================================================================

12.Redis中的操作命令:

   1)redis中有关key的操作命令:

       a).查看数据库中的key:keys pattern【支持通配符】

               ->*:匹配0个或多个字符

               ->?:匹配一个字符

               ->[]:匹配[]里面的任意一个字符,

           keys *:查看数据库中所有的key【*:匹配0个或多个字符】

           keys k*:查看数据库中所有以k开头的key

           keys h*o:查看数据库中所有以h开头,以o结尾的key

           keys h?o:查看数据库中所有以h开头,以o结尾的,并且一共只有三个字符的key

           keys h[abc]llo:查看数据库中所有以h开头以llo结尾的,并且h后面只能取abc中胡词汇表字符的key

   

       b).判断key在数据库中是否存在:exists  key 如果存在,则返回1;如果不存在,则返回0

                      exists  key1 key2 key3 ...返回值是存在的key的数量

           exists  k1

           exists  k1  k2  k3  hello

       c).移动指定key到指定胡数据库实例:move key index

           move k 1:把k移动到1号数据库实例中

       d).查看指定的key的剩余生存时间:ttl key   如果key不存在,返回-2;如果key没有设置生存时间,返回-1

           ttl k1:查看k1的生存时间

       e).设置key的最大生存时间:expire key seconds

           expire k2 20:给k2设置最大生存时间为20s

       f).查看指定key的数据类型:type key

           type key1:查看key1的数据类型

       g).重命名key: rename key newkey

           rename hello key2:把hello重命名为key2

       h).删除指定的key:del key key2 key3...    返回值为实际删除的数量

           del k1 k2 k3

-------------------------------------------------------------------------------------------------------------------------------------------------    

   2) redis中有关string类型数据的操作命令:

       a).将string类型的数据设置到redis中:set  键   值

           set     zsname(键值)     zhangsan(value)

           set     zsage(键值)         20(value)

           set     totalRows (键值)      100(value)

           

           set    zsage 30   -->如果key已经存在,则后来的value会把以前的value覆盖

       b).从redis中获取strings类型的数据:get 键

           get    zsname

           get    zsage

           get    totalRows

       c).追加字符串:append key value  -->返回追加之后的字符串长度

                     -->如果key不存在,则新创建一个key,并且把value值设置为value

           原先:set  phone 138999

           追加:append phone 8888

           -->phone  138999888

       d).获取字符串数据的长度:strlen  key

           strlen    phone(key):获取1289998888的长度

       e).将字符串数值进行加1运算:incr key

                         -->返回加1运算之后的数据

                         -->如果key不存在,首先设置一个key,值初始化为0,然后进行incr运算

                         -->要求key所表示value必需是数值,否则报错

           incr   zsage

           incr   aaa:新创建aaa 0-->incr aaa--->aaa 1

           incr   zsname:报错

       f).将字符串数值进行减1运算:decr  key

                         -->返回减1运算之后的数据

                         -->如果key不存在,首先设置一个key,值初始化为0,然后进行decr运算

                         -->要求key所表示value必需是数值,否则报错

       g).将字符串数值进行加offset运算:incrby   key  offset

                         -->返回加offset之后的数据

                         -->如果key不存在,首先设置一个key,值初始化为0,然后进行incrby运算

                         -->要求key所表示value必需是数值,否则报错

           incrby zsage 10

       h).将字符串数值进行减offset运算:decrby key  offset

                        -->返回减offset之后的数据

                         -->如果key不存在,首先设置一个key,值初始化为0,然后进行decrby运算

                         -->要求key所表示value必需是数值,否则报错

           decrby zsage 10

       i).获取字符串中的子字符串:getrange key startIndex  endIndex

                   --->截取字符串key中从startIndex到endIndex的子字符串

                   --->下标从0开始,自左至右,最后一个字符串胡下标是字符串长度-1

                   --->[闭区间]

                   --->字符串中每一个下标也可以是负数,自右至左,从-1开始

           zhangsan

           getrange  zsname   2  5   -->angs

           getrange  zsname   2 -3   -->angs

           getrange  zsname   0 -1   -->zhangsan

       j).用value覆盖从下标为startIndex开始的字符串:setrange  key  startIndex  value

           setrange zsname 5 xiaosan  -->zhangxiaosan

           zhangxiaosan

           setrange zsname 5 lao    --->zhanglaoosan(覆盖几个算几个)

       k).设置string数据的同时,设置它的最大生命周期:setex  key  seconds value

           setex   k1  20  v1  -->k1最大生存20s,其值为v1

       l).setnx key value :

               --->设置string类型的数据value到redis数据库中,当key不存在时设置成功,否则放弃设置

           set     zsage    20

           setnx zsage    30

       m).批量设置string类型的数据value到redis数据库中:mset key1 value1 key2 value2 ...

           mset k1 v1 k2 v2 k3 v3 k4 v4 k5 v5

       n).批量获取string类型的数据:get key1 key2 key3...

           mget k1 k2 k3 k4 k5 zsname zsage

       o).msetnx key value:

              -->批量设置string类型的数据value到redis数据库中,当所有key都不存在时设置成功,否则放弃设置(只要有一个key存在)

           msetnx kk1 vv1 kk2 vv2 kk3 vv3 k1 v1-->失败(k1已存在)

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

   3).redis中有关list类型数据的操作命令: 单个key-多个有序value 【每个value都是一个string类型】

               ---> 多个value之间是有顺序的,最左侧是表头,最右侧是表尾;

               ---> 每一个元素都有下标,表头元素的下标是0,依次往后排序,最后一个元素的下标是len-1

               --->每一个元素的下标又可以用负数表示,负下标表示从表尾-1开始计算,依次往前为-2,-3,-4...

               --->元素在列表中顺序或者下标由放入的顺序来决定

               --->通过key和下标来操作数据

       a).将一个或者多个value依次插入到列表的表头(最左侧):lpush key value1 value2 value3....

           lpush list01 1 2 3 4->【4 3 2 1】头插法

           lpush list01 5 ->【5 4 3 2 1】

       b).获取指定列表中指定下标区间的元素:lrange  key  startIndex  endIndex

           lrange list01 1 2--->4 3

           lrange list01 1 -2-->4 3 2

           lrange list01 0 -1--->5 4 3 2 1

       c).将一个或多个value依次插入到列表的表尾(最右侧):rpush key value1 value2 value3...

           rpush list02 a b c-->【a b c】

           rpush list02 d e---> 【a b c d e】

           lpush list02 m n--->【n m a b c d e】

                   d).从指定列表中移除并且返回表头元素:lpop key

           lpop list02 --->返回n,表中剩余数据:【m a b c d e】

       e).从指定列表中移除并且返回表尾元素:rpop key

           rpop list02 --->返回e,表中剩余数据:【m a b c d】

                   f).获取列指定列表中指定下标的元素:lindex key

           lindex list01 2--->3

                    g).获取指定列表的长度: llen key

           llen list01

       h).根据count的值移除列表中与value相等的数据,移除的个数为count:lrem key value count value-->移除列表中值为value的数据

               -->count>0:从列表的左侧移除count个跟value相等的数据

               -->count<0:从列表的右侧移除count个跟value相等的数据    

               -->count=0:从列表中移除所有跟value相等的数据

           lpush list03 a a b c a d e b b -->【b b e d a c b a a】

           lrem  list03 2 a-->【b b e d c b a】

           lrem  list03 -1 a--->【b b e d c b】

           lrem  list03 0 b--->【e d c】

       i).截取指定列表中指定下标区间的元素组成新的列表,并且赋值给key:ltrim key startIndex endIndex

           lpush list04 1 2 3 4 5-->【5 4 3 2 1】

           ltrim   list04 1 3--->【4 3 2】

           lrange list04 0 -1---->4 3 2

       j).将指定列表中指定下标的元素设置为指定值:list key index value

           list list04 1 10--->【10 3 2】

       k).将value插入到指定列表中位于pivot元素之前/之后的位置:linsert key before/after pivot value

           linsert list04 before 10 50--->【50 10 3 2】

           linsert list04 after 10 60------>【50 10 60 3 2】

---------------------------------------------------------------------------------------------------------------------------------------

   4).redis中有关set类型数据的操作命令:单key-多无序value【value不能重复】

                   -->一个key对应多个value

                   -->value之间没用顺序,并且不能重复

                   -->元素没有下标,直接操作业务数据和数据的个数

       a).将一个或者多个元素添加到指定集合中:sadd key value1 value2 value3...

                   -->如果元素已经存在,则会忽略

                   -->返回成功加入的元素的个数

           sadd set01 a b c a-->【a b c   顺序是随机的】

           sadd set01 b d e-->【a b c d e】,返回2

       b).获取指定集合中所有的元素:smembers key

           smembers set01

       c).判断指定元素在集合中是否存在:sismember key member

                       -->存在返回1,不存在返回0

           sismember set01 f-->返回0

           sismember set01 a-->返回1

       d).获取指定集合的长度:scard key

           scard set01

       e).移除指定集合中一个或者多个元素:srem key member1 member2 member3...

                       -->不存在的元素会被忽略

                       -->返回成功移除的个数

           srem set01 b d m-->【a c e】

       f).随机获取指定集合中的一个或多个元素:srandmember key [count]

                       --->count>0:随机获取的多个元素之间不能重复

                       --->count<0:随机获取的多个元素之间可能重复

           sadd set02 1 2 3 4 5 6 7 8

           srandmember set02[随机产生一个]

           srandmember set02 3-->从集合随机产生三个不重复的值

           srandmember set02 3-->从集合随机产生三个元素,有可能重复

       g).从指定集合中随机移除一个或多个元素:spop key [count]

           spop set02-->随机移除一个

           spop set02 2-->随机移除2个

       h).将指定集合中的指定元素移动到另一个元素:smove source dest member

                       --->将source中的member移动到dest中

           smove set01 set02 a

       i).获取集合key中有,但是其它集合中都没有的元素组成的新集合:sdiff key key1 key2...

                       --->【差集】

           sdiff set01 set02 set03

       j).获取所有指定集合中都有的元素组成的新集合:sniter key key1 key2...

                       ---> 【交集】

           sniter set01 set02 set03

       k).获取所有指定集合中所有元素组成的大集合:sunion key key1 key2....

                       ---> 【并集】

           sunion set01 set02 set03

---------------------------------------------------------------------------------------------------------------------------------------

   5).redis中有关hash类型数据的操作命令:单key:多个field-value    【保存的是一个对象,正真的业务数据是value】

           [key是这个哈希表的键值,field是每个属性的键值]

                       -->studentzs:id-1001

                                 name-zhangsan

                                 age-20

       a).将一个或多个field-value对设置到哈希表中:hset key field1 value1 field2 value2 field3 value3.....

                       -->如果key field已经存在,把value会把以前的value覆盖

           hset stu1001 id 1001

           hset stu1001 name zhangsan age 20

       b).获取指定哈希表中指定filed的值:hget key field

           hget stu1001 id

           hget stu1001 name

       c).批量将多个field-value设置到哈希表:hmset key field1 value1 field2 value2 field3 value3.....

                       -->与hset相同

           hmset stu1002 id 1002 name lisi age 21

       d).批量获取指定哈希表中的field的值:hmget key field1 field2 field3...

           hmget stu1001 id name age

       e).获取指定哈希表中所有的field和value:hgetall key

           hgetall stu1001

       f).从指定哈希表中删除一个或多个field: hdel key field1 field2 field3.....

           hdel stu1002  name age

       g).获取指定哈希表中所有的filed个数:hlen key

           hlen stu1001

           hlen stu1002

       h).判断指定哈希表中是否存在某一个field: hexists key field

                       -->存在返回1,否则返回0

           hexists stu1001 name

           hexists stu1002 name

       i).获取指定哈希表中所有的field列表:hkeys key

           hkeys stu1001

           hkeys stu1002

       j).获取指定哈希表中所有的value列表:hvals key

           hvals stu1001

           hvals stu1002

       k).对指定哈希表中指定field值进行加法运算:hincrby key field int

           hincrby stu1001 age 5--->20+5=25

       l).对指定哈希表中指定field值进行浮点数加法运算:hincrbyfloat key field float

           hset stu1001 score 80.5

           hincrbyfloat stu1001 score 5.5-->86

       m).将一个field-value对设置到哈希表中:hsetnx key field value

                       -->当key-value已经存在,则放弃设置;否则,设置file-value

           hsetnx stu1001 id 1003-->放弃设置

-----------------------------------------------------------------------------------------------------------------------------------------------

   6).redis中有关zset类型数据的操作命令:单key-多value   【有序集合】

                       -->本质上是集合,所有元素不能重复

                       -->每一个元素都关联一个分数,redis会根据分数(score)对元素进行自动排序

                       -->分数可以重复,元素不能重复

                       -->既然有序集合中每一个元素都有顺序,那么也有下标

                       -->有序集合中元素的排序规则又和列表中元素的排列规则不同

       

       a).将一个或者多个member及其score值加入集合:zadd key score1 member1 score2 member2...

           zadd  zset01  10   z1  30  z3  20 z2  40  z4

           zadd  zset01   60  z2--->将原先的z2分数覆盖

       b).获取指定有序集合中指定下标区间的元素:zrange key startIndex endIndex  [withscores显示分数]

           zrange zset01 0 -1--->z1 z3 z4 z2

           zrange zset01 0 -1 withscores

       c).获取指定有序集合中指定分数区间【闭区间】的元素:zrangebyscore key min max  [withscores]

           zrangebyscore  zset01 30 50 withscores

       d).删除指定有序集合中一个或多个元素:zrem key member member1 member2 member3....

           zrem zset01 z3 z4

       e).获取指定集合中所有元素的个数:zcard key

           zcard zset01

       f).获取指定有序集合中分数在指定区间内的元素个数:zcount key min max

           zcount zset01 10 50

       g).获取指定有序集合中指定元素的排名(从小到大,排名从0开始): zrank key member

           zrank zset01 z1

       h).获取指定有序集合中,指定元素的分数:zscore key member

           zscore zset01 z4

       i).获取指定有序集合中指定元素的排名(从大到小,排名从0开始): zrevrank key member

           zrevrank zset01 z4

================================================================================

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
存储 缓存 NoSQL
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
redis分布式锁、redisson、可重入、主从一致性、WatchDog、Redlock红锁、zookeeper;Redis集群、主从复制,全量同步、增量同步;哨兵,分片集群,Redis为什么这么快,I/O多路复用模型——用户空间和内核空间、阻塞IO、非阻塞IO、IO多路复用,Redis网络模型
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
|
27天前
|
监控 NoSQL Redis
看完这篇就能弄懂Redis的集群的原理了
看完这篇就能弄懂Redis的集群的原理了
47 0
|
8天前
|
存储 缓存 关系型数据库
阿里云数据库 SelectDB 多计算集群核心设计要点揭秘与场景应用
在云原生存算分离架构下,多计算集群的实现从技术方案上看似乎并不存在过多难题。但从产品的角度而言,具备成熟易用的多计算集群能力且能运用于用户实际业务场景中,还有较多核心要点需要深度设计
阿里云数据库 SelectDB 多计算集群核心设计要点揭秘与场景应用
|
27天前
|
存储 缓存 负载均衡
带你认识DM 共享存储数据库集群
带你认识DM 共享存储数据库集群
36 3
|
1月前
|
关系型数据库 MySQL Serverless
在部署云数据库PolarDB MySQL版 Serverless集群的过程中问题点
在部署PolarDB MySQL Serverless过程中,常见问题包括配置误解、网络配置错误、资源未及时释放及压测不熟练。建议深入理解配置项,确保合理设置伸缩策略;明确业务需求,使PolarDB与现有服务同处一地域与VPC;利用提醒功能管理资源生命周期;按官方指南执行压测。新用户面临的学习曲线、资源管理自动化不足及成本控制难题,可通过增强文档友好性、引入智能成本管理与用户界面优化来改善。
49 1
|
2月前
|
存储 NoSQL 算法
Redis 集群模式搭建
Redis 集群模式搭建
64 5
|
2月前
|
NoSQL Linux Redis
Redis性能优化问题之想确认Redis延迟变大是否因为fork耗时导致的,如何解决
Redis性能优化问题之想确认Redis延迟变大是否因为fork耗时导致的,如何解决
|
1月前
|
运维 监控 数据库
在OceanBase数据库中,obd集群版本需在线升级4.3.1.0升级至4.3.2
【8月更文挑战第14天】在OceanBase数据库中,obd集群版本需在线升级4.3.1.0升级至4.3.2
41 0
|
2月前
|
存储 缓存 NoSQL
高并发架构设计三大利器:缓存、限流和降级问题之Redis用于搭建分布式缓存集群问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之Redis用于搭建分布式缓存集群问题如何解决