随笔 - 204,  文章 - 0,  评论 - 19,  阅读 - 49万

一、背景

以前也看过一点Redis的内容,现在详细的介绍一下。

二、介绍

1.Redis是完全开源的数据库,遵从BSD协议,是一个高性能的key-value数据库。

1.Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
2.Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
3.Redis支持数据的备份,即master-slave模式的数据备份。

2.Redis的优势

1.性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
2.丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
3.原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
4.丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

3.Redis的数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

3.1 字符串

string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。

string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。

string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。

实例

用SET(可以小写)设置string的数据字段  单引号或者双引号都可以
用GET获取数据

SET first "我爱Redis"
>>> OK
GET first
>>> "我爱Redis"

3.2 Hash(哈希)

Redis hash 是一个键值(key=>value)对集合。

Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

每个 hash 可以存储 232 -1 键值对(40多亿)。

实例

复制代码
使用HMSET设置数据

使用HGET获取数据,使用对应的key获取对应的field

HMSET runoob field1 "Hello" field2 "World"
>>> OK
HGET field1
>>> "Hello"
HGET field2
>>> "World"
复制代码

3.3 List(列表)

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。其中左边默认为列表的头部(索引小的),右边默认为列表的尾部(索引大的),同时列表中的数据可以重复
列表最多可存储
232 - 1 元素 (4294967295, 每个列表可存储40多亿)。

实例

复制代码
Lpush——先进后出,在列表头部插入元素
Rpush——先进先出,在列表的尾部插入元素
Lrange——出栈,根据索引,获取列表元素
Lpop——左边出栈,获取列表的第一个元素
Rpop——右边出栈,获取列表的最后一个元素
Lindex——根据索引,取出元素
Llen——链表长度,元素个数
Lrem——根据key,删除n个value
Ltrim——根据索引,删除指定元素
Rpoplpush——出栈,入栈
Lset——根据index,设置value
Linsert before——根据value,在之前插入值
Linsert after——根据value,在之后插入值
复制代码

3.3.1 顺序和添加元素的验证:

复制代码
然后lpush,rpush,lpush说明他的添加元素的顺序以及输出的结果
> Lpush list1 java
(integer) 1
> rpush list1 java1
(integer) 2
> lpush list1 python
(integer) 3
> lrange list1 0 10
1) "python"
2) "java"
3) "java1"
复制代码

3.3.2 RpopLpush指令

指令RpopLpush  list1  list2表示:list1从右边出栈的元素从左边加入到list2中
>Rpoplpush list1 java2
"java1"
> lrange list1 0 10
1) "python"
2) "java"
> lrange java2 0 10
1) "java1"

3.3.3 pop指令等

复制代码
> Lrange list1 0 -1
1) "javak-1"
2) "python"
3) "java"
4) "javak-2"
> Rpop list1
"javak-2"
> Lpop list1
"javak-1"
> Lrange list1 0 -1
1) "python"
2) "java"
> Lindex list1 8  没找到就是nil
(nil)
> Lindex list1 1
"java"
> llen list1
(integer) 2
复制代码

3.3.4 插入指令

复制代码
插入指令语法:Linsert list_object  after/before  列表中元素   插入元素
> Linsert list1 after java java1
4
> lrange list1 0 -1
1) "java"
2) "java1"
3) "python"
4) "java"
> Linsert list1 before java java2
5
> lrange list1 0 -1
1) "java2"
2) "java"
3) "java1"
4) "python"
5) "java"
> Linsert list1 before javan javak
-1
> lrange list1 0 -1
1) "java2"
2) "java"
3) "java1"
4) "python"
5) "java"
注意:如果元素没有就会显示插入失败,返回-1的值,插入顺序只有左插入,在遇到第一个元素时就插入并结束插入过程
复制代码

3.3.5 索引操作和值操作

复制代码
语法:Lindex list_object index表示从列表对象中获取索引位置的元素
> lrange list1 0 -1
1) "java2"
2) "java"
3) "java1"
4) "python"
5) "java"
> Lindex list1 3
"python"
> Lindex list1 100
(nil)

语法:Lset list_object index  替换内容,表示从列表中选取index的元素,并进行替换
> lrange list1 0 -1
1) "java2"
2) "java"
3) "java1"
4) "python"
5) "java"
> lset list1 0 php
OK
> lrange list1 0 -1
1) "php"
2) "java"
3) "java1"
4) "python"
5) "java"

Lrem list_object number key:根据key值删除列表对象中的指定数量的元素
> lrange list1 0 -1
1) "java"
2) "python"
3) "java1"
4) "java"
5) "python"
6) "java1"
> lrem list1 1 python
(integer) 1
> lrange list1 0 -1
1) "java"
2) "java1"
3) "java"
4) "python"
5) "java1"

Ltrim list_object start_index  end_index:根据index的删除列表对象中的指定元素,需要注意压栈的顺序,从左边入栈左边就是小的,从右边入栈右边就是小的
> Lpush list1k java php python ruby Django
(integer) 5
> lrange list1k 0 -1
1) "Django"
2) "ruby"
3) "python"
4) "php"
5) "java"
> Ltrim list1k 0 2
OK
> lrange list1k 0 -1
1) "Django"
2) "ruby"
3) "python"
复制代码

3.4 Set(集合)

Redis 的 Set 是 string 类型的无序集合。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

注意:根据集合内元素的唯一性,第二次插入的元素将被忽略。

集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。

3.5 zSet(有序集合)

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

zset的成员是唯一的,但分数(score)却可以重复。

4.各类数据的应用场景

类型简介特性场景
String(字符串) 二进制安全 可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M ---
Hash(字典) 键值对集合,即编程语言中的Map类型 适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去) 存储、读取、修改用户属性
List(列表) 链表(双向链表) 增删快,提供了操作某一段元素的API 1,最新消息排行等功能(比如朋友圈的时间线) 2,消息队列
Set(集合) 哈希表实现,元素不重复 1、添加、删除,查找的复杂度都是O(1) 2、为集合提供了求交集、并集、差集等操作 1、共同好友 2、利用唯一性,统计访问网站的所有独立ip 3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐
Sorted Set(有序集合) 将Set中的元素增加一个权重参数score,元素按score有序排列 数据插入集合时,已经进行天然排序 1、排行榜 2、带权重的消息队列

三、参考与手册

菜鸟教程这里有关于Redis很详细的操作,可以参考。

在线网站这个网站可以进行在线学习。

posted on   蔚蓝色の天空  阅读(110)  评论(0编辑  收藏  举报

点击右上角即可分享
微信分享提示