一十一

一十一

发表于 2018-06-12 08:52:01

Redis简介

Redis是基于内存,也可以基于磁盘持久化nosql数据库,使用c语言开发。

数据存储结构key-value

 Redis命令

redis是一种高级的key:value存储系统,其中value支持五种数据类型:

1.字符串(strings)

2.字符串列表(lists)

3.字符串集合(sets)

4.有序字符串集合(sorted sets)

5.哈希(hashes)

而关于key,有几个点要提醒大家:

1.key不要太长,尽量不要超过1024字节,这不仅消耗内存,而且会降低查找的效率;

2.key也不要太短,太短的话,key的可读性会降低;

3.在一个项目中,key最好使用统一的命名模式,例如user:10000:passwd。

 

Strings

Redis存储结构是key:valuevalue strings数据类型。

命令

语法set key value

1) set name zhangsanfeng

a) 给Strings类型key是name 添加一个

2) get name

a) 获取keyname属性值。

3) incr age

a) 给数字字符类型自动加1

b) 把数字字符类型自动转换integer类型,然后执行再加上1

4) decr age

a) 给数字字符类型自1

b) 把数字字符类型自动转换integer类型,然后执行减去1

5) incrby age 10

a) 给指定键值加速10

6) decrby age 10

a) 给指定键值减去10

Hash

Hash集合类型,适合于用来存储对象。Java集合类型是用来存储对象。

存储数据结构分析:

第一种数据结构

 image.png

存取对象,使用一个key,使用一个key获取一个对象必须使用反序列化

缺点

占用IO资源。

第二种数据结构:

 image.png

缺点

用户ID多次使用,数据冗余。资源浪费

第三种数据结构:

 image.png

Redis存储结构:key是用户ID value:就是hash类型数据。

命令

1) hset user username zhaowuji

a) 给userUsername属性设置一个值

2) hget user username

a) 获取UserUsername属性

3) hdel user password …..

a) 删除User属性

4) hsetnx user email 123@qq.com

a) 如果useremail属性值已经存在,不覆盖

b) 如果不存在,设置值。

5) hmset user password 123 age 11

a) 同时设置多个值

6) Hmget user username age password

Lists

List集合数据结构:类似数组,数据是顺序存储。

List集合链表结构:通过指针从头指针查询到尾指针查找元素。

 

命令

 

1) lpush mylist a b c d

 

a) 给list类型数据结构设置多个值

 

2) lrange mylist 0 -1

 

a) 获取mylist集合中所有

 

b) 0值链表开始位置

 

c) -1:链表的结束位置

 

3) lpop mylist

 

a) 出栈集合mylist:出栈链表头指针元素。

 

4) lrem mylist 3 a

 

a) 删除链表mylist中前3个等于a

 

5) lset mylist 2 s

 

a) 给链表mylist集合中2角标位置设置一个值,覆盖原值。

 

6) linsert mylist after s b

 

a) 在集合链表mylsits元素后面插入一个b

 

Set

 

命令

 

1) sadd myset a b c

 

a) 给set集合myset设置值:a b c

 

b)  Set集合元素不允许重复

 

2) smembers myset

 

a) 获取集合myset中值

 

3) srem myset a b

 

a) 删除集合myset中元素

 

4) smove myset myset1 c

 

a) 把集合myset元素c移动到集合myset1

 

 Sorted set

 

Set集合:有序集合。

 

 给set集合中每一元素都设置一个得分,根据得分排序

 

 Set集合元素不允许重复,得分可以重复。

 

设置得分语法:ZADD key score member [score] [member]

 

命令

 

1) zadd mysset 1 one 2 two 12 three 9 four 10 five

 

a) 给集合mysset集合添加5元素,每一个元素都设置一个得分。

 

2) zcount mysset 1 10

 

a) 获取分数110元素个数,默认是闭区间。

 

3) zcount mysset (1 10

 

a) 获取分数110元素个数,左边是开区间(不包含1元素

 

4) zcount mysset -inf +inf

 

a) 获取所有元素

 

b) –inf:最低值

 

c) +inf:最高

 

5) zrange mysset 0 -1 withscores

 

a) 获取集合mysset中所有元素

 

b) 0:头部元素

 

c) -1表示尾部元素

 

d) Withscores:查询元素时候,把分数查询出来

 

6) zrangebyscore mysset 1 10 withscores limit 2 2

 

a) 根据分数大小来获取元素:

 

b) Limit分页获取值。

 

多数据库实例

 

Redis支持16数据库实例,数据库实例角标从0—15,使用redis客户端登录redis服务器,默认登录0数据库。

 

登录其他数据库实例:

 

登录语法:select 数据库实例ID角标

 

登录1号数据库:

 

127.0.0.1:6379> select 1

 

OK

 

127.0.0.1:6379[1]>

 

需求:把0数据库数据移动1号数据库

 

命令move user 1 //移动user1数据库

 

事务

 

事务命令:

 

开启事务:multi

 

提交事务:exec

 

回滚事务:discard

 

监听事务:watch乐观锁

 

用户A,用户B 同时读取商品数量itemNum=1,用户A,用户B都需要购买商品,商品数量需要减去1使用乐观锁解决问题:

 

事务一致性

 

设计:商品数量添加,在添加过程出一个错误,查看程序执行一致性。

 

127.0.0.1:6379> multi//开启事务

 

OK

 

127.0.0.1:6379> incr itemNum

 

QUEUED

 

127.0.0.1:6379> incr itemNum

 

QUEUED

 

127.0.0.1:6379> incrby itemNum 10

 

QUEUED

 

127.0.0.1:6379> lpop itemNum//使用操作list数据结构命令操作String类型,出现错误

 

QUEUED

 

127.0.0.1:6379> decr itemNum

 

QUEUED

 

127.0.0.1:6379> decrby itemNum 10

 

QUEUED

 

127.0.0.1:6379> exec//提交事务

 

1) (integer) 2

 

2) (integer) 3

 

3) (integer) 13

 

4) (error) WRONGTYPE Operation against a key holding the wrong kind of value

 

5) (integer) 12

 

6) (integer) 2

 

 

 

特点redis事务不遵循ACID大一统理论,即使中间执行出现错误,后面不影响执行。

 

12.2 事务回滚

 

 

 

127.0.0.1:6379> mult//开启事务

 

OK

 

127.0.0.1:6379> incr itemNum

 

QUEUED

 

127.0.0.1:6379> incr itemNum

 

QUEUED

 

127.0.0.1:6379> discard//事务回滚

 

OK

 

127.0.0.1:6379> get itemNum

 

"2"

 

12.3 Watch

 

Watch监听事务:乐观锁

 

乐观锁:一旦发现被监听事务变量发生了变化,事务回滚。

 

127.0.0.1:6379> watch itemNum

 

OK

 

127.0.0.1:6379> multi

 

OK

 

127.0.0.1:6379> decr itemNum //当检测到itemNum发生变化时,此命令不执行

 

QUEUED

 

127.0.0.1:6379> exec

 

(nil)

 

127.0.0.1:6379> get itemNum

 

"0"

 

 Redis持久化

 

Rdbredis系统默认持久化策略)

 

Rdb持久化优点

 

1) 持久化文件将只包含一个文件

 

2) 灾难恢复,主从复制 效率比较高。

 

3) 持久化工作:子进程

 

Rdb缺点

 

1) 数据安全性不是很好

 

Rdb数据持久同步策略

 

 缺省情况下,Redis会将数据集的快照dumpdump.rdb文件中。此外,我们也可以通过配置文件来修改Redis服务器dump快照的频率,在打开redis.conf文件之后,我们搜索save,可以看到下面的配置信息:
    save 900 1              #900(15分钟)之后,如果至少有1eky发生变化,则dump内存快照。

    save 300 10            #300(5分钟)之后,如果至少有10key发生变化,则dump内存快照。
    save 60 10000        #60(1分钟)之后,如果至少有10000key发生变化,则dump内存快照。

 

Aof

 

Aof持久化优点

 

1) 根据redis aof同步策略,数据有更高安全性

 

Aof缺点

 

1) 性能比rdb


TestOps中文社区公众号
 
 微信   :  wonter
 QQ群 :  632418478
945阅读 | 0评论
你的回应
写文章

TestOps中文社区公众号
 
 微信   :  wonter
 QQ群 :  632418478
一周热门
一月热门
意见反馈
举报