入门学习:
启动redis:redis-server
再启动一个客户端,使用命令:redis-cli shutdown 进行关闭redis
现在开启redis服务 在另一个cmd中打开redis目录 输入命令:redis-cli -h 127.0.0.1 -p 6379连接到当前服务
设置键值 和 获取键值
keys * 是获取当前redis中存储的所有键名(如果数量较大会比较影响性能)
验证是否存在键名 exists关键字 返回0 或 1
删除键 del 关键字
获取键值的数据类型 type关键字
redis较之memcache的优点之一就是多样的数据类型 其中有五个类型:string(字符串) set(集合) zset(有序集合) list(列表) hash(散列)
首先学习string基本类型
string可以存储任何形式的字符串,二进制,或者json后的图片,最大容量为512MB
如上面使用的 set key value | get key >> "value"
简单的设置和获取键值
递增数字 incr 关键字 初始值1
会设置和获取之后 需要注意:key设置起名 例如设置某个文章的访问量 使用INCR递增 INCR post:文章ID:page.view 即对象类型:对象ID:对象属性 多个属性时使用" . "连接 这样可读性和查询较简单
增加指定浮点数 INCRBYFLOAT
向尾部追加值 APPEND
获取字符串长度 STRLEN
// 如果是UTF-8的中文 那么一个字符长度为3
获取| 设置多个键值 MSET | MGET
位操作 GETBIT
SETBIT 设置比特位
基础的string类型操作学习之后下来就是散列(hash)类型
使用场景:例如一篇博客,如果用string我们需要一个文章IDkey 对应的整个文章标题,内容,标签等信息全部存在一个字符串中,如果后面我们只需要获取其中一个例如标题,那我们需要将整个字符串获取再筛选,这样造成了处理效率上很大的浪费,而redis中的hash就可以优化和避免这种情况,
例如 :
下面学习HASH的命令
简单的HSET 和HGET 设置和获取键值
继续增加键值
一次增加多个键值 HMSET HMGET
插入某个键时会判断是更新或者插入操作,更新会返回0,插入会返回1
还有判断字段是否存在函数 HEXISTS 存在返回1 不存在返回0
当字段不存在时赋值 HSETNX 源代码如下:
def hset($key, $field, $value)
$isExists = HEXISTS $key, $field
if $isExists is 0
HSET $key, $field, $value
return 1
else
return 0
删除键 HDEL key field
还有获取散列中的所有键 或者 值 HKEYS | HVALS
获取字段数量 HLEN key
第三个数据类型 列表(list)
通过双链表实现list类型
场景:获取数据中ID前10条或最后10条 时间复杂度O(1)
两端增加元素LPUSH | RPUSH
现在1list中键的数据信息:
两端弹出数据 LPOP | RPOP key
按照上面图中数据我们pop测试
获取list中的元素个数 LLEN key
可以看到我们上面pop完1list中所有的数据后 1list这个键会消失(上图2list下面为‘L’list)
>获取列表片段 LRANGE key start stop
类似于array_slice
第二位代表下标 而不能代表分割元素个数 并且为闭区间 [ ]
>删除指定值的元素 LREM key count value
当count为负 代表从右开始查找 为正则从左边开始查找
value 为 需要删除的数值
|count|为删除多少个为value的元素
>获取/设置 指定索引的元素值
LINDEX key value
LSET key index value
从上面可以得出:下标从0开始计算 , 如果下标值已存在会修改当前的值进行覆盖
>删除指定范围之外的所有元素 LTRIM key start end
>向列表中插入元素 LINSERT key BEFORE|AFTER pivot value
从左向右查找pivot值的元素 依据第二个参数BEFORE|AFTER决定 value插入其后还是前
第四种数据类型 set集合
底层是用hash table 实现的,所以其插入,删除,查找都为O(1)
>增加/删除元素 以及查看成员
SADD key member1 member2
SREM key member1
SMEMBERS key
>判断元素是否在集合中
SISMEMBER key member
>集合间运算
SDIFF key1 key2 ...
SINTER key1 key2 ...
SUNION key1 key2 ...
1>SDIFF如其命名,取多个集合中的差集 如 SDIFF({1,2,3} - {2,3,4} )= {1} 注意先后顺序SDIFF({2,3,4} - {1,2,3}) = { 4}
多个集合求差集 会先从左向右计算 (A-B) - C = SDIFF
2>SINTER 求多个集合的交集
如 SINTER({1,2,3} U {2,3,4}) = {2,3}
3>SUNION表示多个集合的并集
>获取集合中元素个数SCARD key
>集合运算并将结果存储
SDIFFSTORE storeKey set1 set2
SINTERSTORE storeKey set1 set2
SUNIONSTORE storeKey set1 set2
>从元素中弹出一个元素
SPOP key
下面是最后一个数据元素 有序集合 ZSET
有序集合和列表存在类似关系:
1》二者都是有序的(下标)
2》二者都可以获取一定范围的值
区别:
1》列表类型通过双向链表实现,获取靠近两端数据非常快,而当数据量增加之后 获取中间数据比较慢,所以列表更适合于“新鲜事”和“日志”这些很少访问中间元素的应用功能
2》有序集合类型使用散列表和跳表实现,所以即使读取中间位的数据速度也很快(O(logN)))
3》列表不能简单地调整某个元素位置,而集合可以(更改分数)
4》有序集合比列表更费内存
下面学习操作命令:
>增加元素ZADD key score member [score member ...]
获取元素分数 ZSCORE key member
>获得排名在某个范围的元素列表
ZRANGE key start stop [withscore]
>获得指定分数范围的元素
ZRANGEBYSCORE key min max [withscore] [limit offset limit]
+inf 表示无穷大 -inf表示无穷小
' ( '表示开区间
limit 和SQL中的一样
>修改某个元素的分数
ZINCRBY key increment member
>获取集合中元素数量 ZCARD key
>获得某个分数范围元素个数ZCOUNT key min max
>删除一个/多个元素ZREM key member1 member2 ...
>按照排名范围删除元素ZREMRANGEBYRANK key start stop (索引下标值)
>按照分数排名范围删除元素ZREMRANGEBYSCORE key min max
redis五大数据结构学到这啦~~~