您的位置:首页 > 理论基础 > 数据结构算法

Java 数据库之 redredis 使用----数据结构

2017-10-16 22:34 176 查看
(一)redis概述:

高性能键值对数据库,支持的键值数据类型:

1.字符串类型(string)

2.字符串列表类型(list)

3.有序集合类型(sortset)

4.哈(hash)希散列类型

5.字符串集合类型(set)

(二)redis应用场景:

1.缓存.:数据的查询,新闻信息,商品信息,聊天室在线好友的列表

2.任务队列(秒杀,抢购等等)

3.网站访问的统计

4.数据过期处理:精确到毫秒应用排行榜

5.分布式集群架构中的session的分离

(三).数据结构

(1).数据结构之一字符串存储 (String)

1.二进制操作,二进制安全,存入和获取的数据相同

2.Vlue最多可以容纳的数据长度是512M

存储存储String常用的命令:

1.赋值: set company imooc

2.取值:get company   得到"imooc";  例如:getset company baidu  现获取company的值再设置company的新值百度

3.删除 :del person  (无值nil)

(1)递增,incr num  如果没有num初始值默认0 +1  

(2)递减 decr num 如果没有num初始值默认0 -1

4:扩展命令:

(1),incrby 某一个key  value   例如:incrby num 5

可以将指定的value加几 ,如果key不存在,默认为0,再加5,不能转成整形返回错误信息

(2),decrby 某一个key  value   例如:decrby nummber 3  (没有3减去3就是-3了)

可以将指定的value减几 ,如果key不存在,默认为0,再减3,不能转成整形返回错误信息

(3)append key  value ----拼凑字符串 
如果key存在,在原有的value后追加这个值

append num 5  

结果:(integer)2   <-------返回的字符串的长度

get num  

结果: "35"   <-------返回的value字符串的内容

如果key不存在,它会创建一个字符串

append num5  123

结果:(integer)3   <-------返回的字符串的长度

get num5

结果: "123"   <-------返回的value字符串的内容

(2).数据结构之二哈希(hash)

存储Hash(map容器)存储值,对象的信息,用户名密码年龄信息,如果hash包含了很少的字段,那么这个类型的数据将占有很少磁盘空间

1.String Key和String Value的map容器 

2.每个Hash可以存储4294967295个键值对

存储存储Hash常用的命令:

1.赋值: 

hset myhash username jack  (存值操作)

hset myhash age 18  (存值操作)

hmset myhash username2 rose age 18 (可以设置多个keyvalue操作)

2.取值:

hget myhash  username  

得到"jack";  

hmget myhash username age

(1)"jack"

(2)"18"

hgetall myhash  (获取全部属性,属性值)

3.删除 :

hdel myhash username2 age (删除多个属性) 

(integer)0  <---------不存在会返回

del username2

4:增加数字:

(1)增加数字,hincrby num  

5:自学命令:

(1)hexists myhash username 判断指定key中的某个属性是否存在

返回结果:(integer) 1

(2)hexists myhash password  

返回结果:(integer) 0

(3)hgetall myhash 

1)"user"

2)"jack"

3)"age"

4)"23"

hlen myhash 

返回结果:(integer) 2

hkeys myhash(获得所有key)

返回结果:

1)username

2)age

hvals myhash(获得所有key的值)

返回结果:

1)jack

2)23

(3).数据结构之一存储list 
概述:

在redis中,list类型是按着插入顺序排序的字符串的链表和数据结构中的普通链表一样的我们可以在它的头部左侧-尾部右侧去添加新的元素,在插入的时候如果该键不存在,那么redis会这个键创建一个新的链表,与此相反如果链表中的所有元素都移除了,该键也会被从数据库中删除.

元素的插入和删除效率:

如果我们在链表两头插入和删除元素是非常高效的操作.

如果链表中存在了100w中条记录,也可在常量的时间完成

如果元素的插入和删除的操作是作用在链表的中间,那么效率就比较低了

1.ArrayList使用数组方式

2.linklist使用双向链接方式

3.双休链表中增加数据

3.双休链表中删除数据

存储存储list常用的命令:
1.两端添加

左侧添加

lpush mylist a b c 

lpush mylist 1 2 3 

mylist链表样式模型展示:

|-----------------------------------------------------|

|   3    |    2    |     1   |   c     |    b    |     a   |

|-----------------------------------------------------|

右侧添加

rpush mylist2 a b c

rpush mylist2 1 2 3

mylist2链表样式模型展示:

|------------------------------------------------------|

|   a    |    b    |     c   |    1     |    2    |     3   |

|------------------------------------------------------|

2.查看列表

lrange mylist 0 5  (从哪开始从哪结束)

|-----------------------------------------------------|

|   3    |    2    |     1   |   c     |    b    |     a   |

|-----------------------------------------------------|

lrange mylist2 0 -1:

|------------------------------------------------------|

|   a    |    b    |     c   |    1     |    2    |     3   |

|------------------------------------------------------|

lrange mylist2 0 -2

|-------------------------------------- -------|

|   a    |    b    |     c   |    1     |    2     |

|---------------------------------------------|

3.两端弹出

左边弹出:

lpop (key)   左侧弹出----返回并弹出指定的key所关联的链表的头部元素,如果不存返回nill,如果存在返回第一个元素(把最左侧的第一个弹出)

示例:

lpop mylist 

结果:

"3"

查询一下 lrange mylist 0 -1   (0到最后一个元素)

|---------------------------------------------|

|    2    |     1   |   c     |    b    |     a   |

|---------------------------------------------|

"3"已经被弹出.
右侧弹出----尾部弹出
10875
:

rpop mylist2

|---------------------------------------------|

|   a    |    b    |     c   |    1     |    2    |

|---------------------------------------------|

"3"已经被弹出.
4.获取列表元素个数

llen mylist  返回(integer)5

1)"2"

2)"1"

3)"c"

4)"b"

5)"c"

llen mylist3  返回(integer)0   没有返回0

5.扩展命令

lpushx  指定的key存在的时候向相关的list的头部去插入一个具体的值,如果不存在就不会进行插入了

lpushx mylist x 

lrange mylist 0 -1

结果如下:

|-----------------------------------------------------|

|   x    |    2    |     1   |   c     |    b    |     a   |

|-----------------------------------------------------|

lpushx mylist3 x   没有mylist3  返回(integer)0
右侧插入   rpushx mylist2 y

查询         lrange mylist 0 -1

结果如下:

|------------------------------------------------------|

|   a    |    b    |     c   |    1     |    2    |     y   |

|------------------------------------------------------|

删除

lrem (具体的key) (count个数) (value)      

解释:删除count个为value的元素,

count>0从头向尾部遍历,并删除count个为value的元素

count<0从后面向前部遍历

count=0删除链表中所有等于某一个值的元素

示例:

lpush mylist3 1 2 3

lpush mylist3 1 2 3

lpush mylist3 1 2 3

查看

lrange mylist3 0 -1

结果显示:

 

|--------------------------------------------------------------------------------|

|   3    |    2    |     1   |    3     |    2    |     1   |     3    |    2  |   1    |  

|--------------------------------------------------------------------------------|

lrem mylist3 2 3    删除mylist3中2个3,从头到尾删除2个3

查看 lrange mylist3 0 -1

结果显示:

|-------------------------------------------------------------|

|    2    |     1   |    2    |     1   |     3    |    2  |   1   |  

|-------------------------------------------------------------|

lrem mylist3 -2 1    删除mylist3中2个1,从尾到头删除2个1

查看 lrange mylist3 0 -1

结果显示:

|---------------------------------------------|

|    2    |     1   |    2    |     3    |    2   |  

|---------------------------------------------|

lrem mylist3 0 2    删除mylist3中所有2

查看 lrange mylist3 0 -1

结果显示:

|-------------------|

|    1    |     3     |  

|-------------- -----|

lset  命令

概述:

 在某一个位置给它添加指定的元素,设置链表中的某个index的角标的元素的值   ,0第一个元素,-1最尾部的元素,操作链表的角标不存在抛出异常

示例:

lrange mylist 0 -1   查看mylist的内容

|-----------------------------------------------------|

|   x    |    2    |     1   |   c     |    b    |     a   |

|-----------------------------------------------------|

set命令使用:

lset mylist 3  mmm      第三个角标的时候设置mmm

lrange mylist 0 -1   再查看mylist的内容,结果如下:

|-----------------------------------------------------------|

|   x    |    2    |     1   |    mmm    |    b    |     a   |

|-----------------------------------------------------------|

linsrt 命令插入 还可以在某一个元素前或后插入一个元素

初始化数据

lpush mylist4 a b c 

lpush mylist4 a b c 

lrange mylist4 0 -1   再查看mylist4的内容,结果如下:

|-----------------------------------------------------|

|   c    |    b    |     a   |    c    |    b    |     a   |

|-----------------------------------------------------|

功能实现:
linsert mylist4 before b 11

lrange mylist4 0 -1   再查看mylist4的内容,结果如下:

|---------------------------------------------------------------|

|   c    |    11    |    b    |     a   |    c    |    b    |     a   |

|----------------------------------------------------------------|

linsert mylist4 after b 22

lrange mylist4 0 -1   再查看mylist4的内容,结果如下:

|-------------------------------------------------------------------------|

|   c    |    11    |    b    |     22   |    a   |    c    |    b    |     a   |

|-------------------------------------------------------------------------|

rpoplpush  功能                  

建链表中的尾部元素弹出并添加到头部

初始化数据

lpush mylist5 1 2 3 

lpush mylist6 a b c 

都查看一下
lrange mylist5 0 -1   再查看mylist5的内容,结果如下:

|---------------------------|
|   3    |    2    |    1     | 
|---------------------------|
lrange mylist6 0 -1   再查看mylist6的内容,结果如下:

|---------------------------|
|   c    |    b    |    a     | 
|---------------------------|
rpoplpush功能演示使用场景
rpoplpush mylist5 mylist6 
在查看mylist5和mylist6

|------------------|
|   3    |    2     | 
|------------------|
在查看mylist6

|------------------------------------ |
|   1    |    c    |    b     |     a    |
|-------------------------------------|

rpoplpush使用场景:

redis 链表经常用于消息队列的一些服务,完成多个程序的消息之间的交互,

假设一个程序正在执行lpush 操作,向链表中添加新的元素称为这样的程序为生产者

另外一个程序正在执行rpop  操作从链表中取出元素称为为消费者

与此同时消费者程序在取出元素后立刻崩溃,由于该消息已经被取出,且没有被正长处理,那么我们就可以认为消息已经丢失了,那么由此可能会导致业务数据丢失,或者是业务状态的不一致等现象的发生,然而通过rpoplpush命令,消费者程序在主消息队列中取出元素之后,再将它插入到一个备份的队列当中,直到我们的消费者程序完成,正常的逻辑处理后 , 再将消息从备份队列中删除, 这样的话我们可以提供一个守护的线程,然后当发现备份队列消息过期的时候,
可以重新将他放回到主消息的队列当中,以便其他的一些消费者可以继续去处理.

消息发布系统 

   

                                                                                                                                                                  满足条件的 成功的消息

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

              mylist                                                                                                                              |                                                                                                           | 
                                                                                                                                                                           |                                                                                   
                       |

----------------------------------------------------------                                   ----------------------------->        |                     放这个里面                                                                   |    

|                                                                   |                               -----     达到的设置条件             |                                                                                                           |

|           1.message1                                    |                       -------                                                  |                                                                                                          |       
  

|           2.message2                                    |                ------                                                          -------------------------------------------------------------------------------------------

|           3.message3                                    |          -----                      设置条件time>=12;

|           4.message4                                    |----------

|           5.message5                                    |           ----

|           ..............                                         |                ------                                                   未达到的条件的消息,在原有的队列当中循环,只用满足条件后才能弹栈

|           ..............                                         |                        ------                                                 -------------------------------------------------------------------------------------------

|                                                                  |                             ----- 未达到设置条件                   |                                                                                                           |

|---------------------------------------------------------                                         ------------------------->      |                        放这个里面                                                                |       

                                                                                                                                                    |                                                                                                         
 |                  

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

(4).数据结构之一存储set

1.和list不同的是,不允许出现重复的元素
2.可包含最大元素数量4294967295
存储存储set常用的命令:

1.添加/删除: 
sadd myset a b c (添加)

sadd myset 1 2 3 (添加)

srem myset 1 2   (删除)

smembers myset 显示结果

|-----------------------------------|
|   c    |    b    |     a   |   3     |
|-----------------------------------|
sismember myset a 
(integer)1   就说明存在

sismember myset x

(integer)0   就说明不存在

2.获得集合中元素数量:
示例:

smembers myset  结果如下:

|-----------------------------------|
|   c    |    b    |     a   |   3     |
|-----------------------------------|

scard myset  得到具体数量

返回:(integer)4

srandmember myset  结果

返回:"b"   (此结果是随机的)

3.集合中差集运算:
示例:

进行一次差集运算:

sadd mya1 a b c

sadd myb1 a  c 1 2

sdiff mya1 myb1

返回结果:

"b"

4.集合中交集运算:

进行一次交集运算:

sadd mya2 a b c

sadd myb2 a  c 1 2

sinter mya2 myb2

返回结果:

"c"

"a"

5.集合中并集运算:

sadd mya3 a b c

sadd myb3 a  c 1 2

sunion mya3 myb3

返回结果:

|-----------------------------------------|
|   c    |    2   |  b    |     a   |   1     |
|-----------------------------------------|

6:扩展命令:

将集合的两个相差的成员存储到某一个其他的集合上

sdiffstore my1 mya1 myb1  (把mya1和 myb1相差的集合放到my1上)

smembers my1

"b"

sinterstore   存两个集合的交集然后存起来

sunion          存两个集合的并集然后存起来

smembers my3  查看my3都有啥

redis的set数据类型----使用场景:

1.跟踪一些唯一性的数据,

2.用于维护数据对象之间的关联关系

访问某一博客的唯一ip地址信息,对于这种场景仅需要在每次访问博客的时候将访问者的ip地址

保存到redis当中.set数据类型就会自动保证ip地址的唯一性,

还可以利用set数据类型服务器端聚合,操作的方便的,高效的一些特性用于维护数据对象之间的一些关联关系

比如:购物网站将所有购买某一个电子设备的客户的id,被存到指定的set当中,而购买另一种电子设备客户的id,被存到另外一个set当中,

如果我们想获取有哪些用户同时购买了这两种商品.

(5).数据结构之一存储Sorted-set

概述:

都是字符串的集合

都不允许重复的元素出现一个set

区别:

Sorted-set中的每一个成员都会有一个分数与之关联,redis通过分数来为集合中的成员来进行从小到大的一个排序

Sorted-set中的成员是唯一的,分数可以是重复的,在Sorted-set添加/删除/更新一个成员是非常快的操作,

时间复杂度是集合中成员个数的一个对数,Sorted-set中的成员在集合中位置是有序的.访问中部的成员也是高效的

存储存储Sorted-set常用的命令:
1.添加元素: 

zadd mysort 70 zs 80 ls 90 ww

zadd mysort 100 zs

已经存在元素,新的会替换已有的分数  返回的个不包括原有的值,不显示的

zadd mysort 60 tom

2.获取元素:

zscore mysort zs 

"100"

zcard mysort  (获取元素的数量)

(intgeter)4

3.删除 :

zrem mysort tom ww

zcard mysort 结果

(ingeter)2

4.范围查询

zadd mysort 85 jack 95 rose

zrange mysort 0 -1

|-----------------------------------------|
|   ls   |    jack   |   rose   |   zs    |
|-----------------------------------------|
zrange mysort 0 -1 withscores

连同成绩也显示(有小到大的排序的)

zrevrange mysort 0 -1 withscores

连同成绩也显示(有大到小的排序的)

按范围进行删除
zremrangebyrank mysort 0 4

按分数范围进行删除

zadd mysort 70 zs 80 ls 90 ww

zremrangebyscore mysort 70 90  执行

结果就是:(empty)空了

5:扩展命令:
返回分数在某个之间的成员,在按分数的从低到高排序
add mysort 70 zs 80 ls 90 ww

zrangebyscore mysort 0 100 

结果:

"zs"

"ls"

"ww"

zrangebyscore mysort 0 100 withscores

带着分数来进行显示

zrangebyscore mysort 0 100 withscores limit 0 2

只显示里面的两个

"zs"

"70"

"ls"

"80"

设置指定成员增加的分数

zincrby mysort 3 ls

"83"

zscore mysort ls

"83"

获取分数在某个之间的个数

zcount my sort 80 90

(ingeter)2

使用场景

1.大型游戏积分排行旁

每当玩家的分数发生变化的时候,执行zadd添加命令更新玩家的分数,此后通过zrange获取积分多少的用户的信息

利用通过用户名获取玩家排名信息

z2.构建索引数据
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐