- 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:value类型数据库,value的数据结构是Strings。
命令:
- set username zhangsan
- 给key是Username设置值:zhangsan
- get username
- 获取key为Username的值。
- incr age
- 把age数字类型字符串强制转换成interger,自增1
- incrby age 10
- 把age数字类型字符串强制转换成interger,加上10
- decr age
- 把age数字类型字符串强制转换成interger,自减1
- decrby age 10
- 把age数字类型字符串强制转换成interger,减去10
- Hashes
Redis数据结构是key:value,value是hash结构数据。
Hash适合存取对象。
Key:对象属性,value:可以是一个对象属性值。
存取结构分析:
使用String模式存取:
使用String存储对象,必须使用序列化反序列化。增加IO开销。系统性能降低。
String的存取模式(二)
上面数据存储结构已经经过优化。但是发现:用户ID无限重复,增加开销。
上面这种数据存取结构满足redis存储要求:
命令:
- hset user username lisi
- 给User对象的属性Username设置值lisi
- hget user username
- 获取User对象中Username属性值。
- hexists user username
- 判断User对象中是否有Username属性
- hdel user age email
- 删除User对象中age和email属性
- hsetnx user username lisi
- 如果User对象中Username属性存在,不进行覆盖。
- 如果不存在,创建一个,设置值。
- hmset user email 11@qq passwd 123
- 同时给User对象设置多个属性和属性值
- hmget user username age
- 同时获取对象多个属性值。
- Lists
时间复杂度:
程序执行次数。叫做时间复杂度。
Puclic class demo{
For(int i=0;i<n;i++){
执行n次}}
时间复杂度:O(n)
Puclic class demo{
For(int i=0;i<n;i++){
执行n次
For(int j=0;j<n;j++){
执行n2次}}}
时间复杂度:O(n2)
Puclic class demo{
For(int i=0;i<n;i++){
执行n次
For(int j=0;j<n;j++){
执行n2次}}
For(int j=0;j<n;j++){
执行n2+n次}}
时间复杂度:O(n2+n)
List结构在redis表现形式:链表结构。
询获取2节点数据:
- 首先经过头指针(地址)
- 从头指针开始寻找,一直找到2号节点。
缺点:如果数据较多,查询效率较慢,时间复杂度O(n)
优点:插入数据快,时间复杂度O(1)
双向链表:
Redis数据结构使用双向链表。List结构数据可以重复。
命令:
- Lpush mylist a b c d e f
- 给链表mylist设置了6个值
- Lrange mylist 0 -1
- 获取链表所有元素
- 0:表示首元素
- -1:表示尾元素。
- Lpop mylist
- 出栈mylist链表。(出栈后的元素消失)
- lrem mylist 3 a
- 删除链表mylist中前3个a
- lset mylist 1 s
- 在mylist链表指定位置(链表角标)设置一个值。
- linsert mylist after e f
- 在mylist链表元素第一个e后面设置f
- rpush mylist e f g
- 从链表尾部插入元素
- RPOPLPUSH source destination
- 从source链表出栈一个元素,把元素设置链表destination链表。
- Set
Redis的set数类型:数据不允许重复。
- sadd myset a b c d
- 给set集合myset添加元素a b c d
- Smembers myset
- 获取集合myset元素
- spop myset
- 出栈
- srem myset a b
- 删除myset集合的2个元素。
- smove myset myset1 c
- 从myset移动c元素到myset1
- SortedSets
有序的set集合。
根据set集合元素分数进行排序:
- 分数允许重复
- Set集合数据元素不允许重复。
命令:
- zadd myzset 10 one 12 two 16 three
- 给有序集合myzset设置one,two,three三个元素,并设置得分。
- zcount myzset -inf +inf
- 统计集合myzset元素个数
- –inf:最小分数
- +inf:最大分数
- zcount myzset 10 16
- 统计分数在10到16元素个数
- 默认是闭区间。
- zcount myzset (10 16
- 统计分数在10(开区间)到16元素个数
- 不包含10
- zrange myzset 0 -1 withscores
- 查询集合myzset所有元素名称和分数。
- zrangebyscore myzset 10 16 withscores limit 1 1
- 查询myzset集合10到16数据,从角标1开始查询,每页显示1条。
- Keys
- 查询所有key
- Kyes *
- expire myset1 6
- 给key是myset1设置6秒过期时间。
- 多实例数据库
ORACLE:windows 服务:oracleServiceORCL
oracleServiceXE
oracleServiceBOS
redis是一个多实例数据库:16个数据,排列:0—15
- Redis默认进入0号数据库
- 进入其他数据库:select 角标,进行角标所在数据库。例如:select 1,进入1号数据库。
- 测试多实例数据库
- Move mylist 1
把0号数据库mylist集合移动1号数据库。