redis(一) 安装以及基本数据类型操作

redis安装和使用

redis安装

wget http://download.redis.io/redis-stable.tar.gz
tar zxvf redis-stable.tar.gz
cd redis-stable.tar.gz
make
make install

redis启动

redis-server
redis关闭
redis-cli shutdown

配置

方法一

redis-server /path/to/redis.conf
redis-server /path/to/redis.conf --loglevel warning //设置日志级别

方法二

redis-cli
redis > CONFIG SET loglevel warning

多数据库的选择

默认情况下,客户端自动选择0号数据库。
可以使用select命令来选择其他数据库。
> select 
redis不可以设置数据库的名称,数据库是通过编号来使用的。
redis只有一个全局的密码,不存在访问某个数据库的密码。

数据库基本操作

(1)添加数据和查找数据,通过set/get命令添加和获取数据

127.0.0.1:> select
OK
127.0.0.1:[]> set bar
OK
127.0.0.1:[]> get bar
""
127.0.0.1:[]> get aaa
(nil)

(2)判断一个键是否存在,exists命令可以判断key是否存在,存在返回1,不存在返回0

127.0.0.1:[]> exists bar
(integer)
127.0.0.1:[]> exists aaa
(integer)

(3)删除数据,del命令删除key,返回值为成功删除key的个数

127.0.0.1:[]> del aaa
(integer)
127.0.0.1:[]> del bar
(integer)

(4)获取value的类型

127.0.0.1:[]> set bar
OK
127.0.0.1:[]> type bar
string

(5)自增和自减,incr 、decr以及incrby和decrby实现整数的加减

127.0.0.1:[]> INCR ab
(integer)
127.0.0.1:[]> INCR ab
(integer)
127.0.0.1:[]> INCRBY ab
(integer)
127.0.0.1:[]> DECR ab
(integer)
127.0.0.1:[]> DECRBY ab
(integer)

(6)增加指定浮点数,incrbyfloat可以指定自增的浮点数

127.0.0.1:[]> INCRBYFLOAT ab 1.1
"2.1"

(7)向尾部追加,append命令可以向字符尾部追加内容

127.0.0.1:[]> set key hello
OK
127.0.0.1:[]> append key world
(integer)
127.0.0.1:[]> get key
"helloworld"

(8)获取字符串长度,strlen获取value的长度

127.0.0.1:[]> STRLEN key
(integer)

(9)批量设置和获取,通过mset和mget命令可以批量执行设置和获取

127.0.0.1:[]> mset key1 va1 key2 va2
OK
127.0.0.1:[]> mget key1 key2
) "va1"
) "va2"

(10)位操作

getbit key offset
setbit key offset
bitcount key [start] [end]
bitop operation destkey key [key ...]

散列类型

其实这里的散列类型就是类似于非结构化数据,json数据一样。
{
"id":,
"name":"test"
}

基本操作

(1)存储方法,可以通过hset和hget来设置和获取数据

127.0.0.1:[]> hset user id
(integer)
127.0.0.1:[]> hset user name test
(integer)
127.0.0.1:[]> hget user id
""
127.0.0.1:[]> hget user name
"test"

(2)判断字段是否存在,hexists命令,返回1存在,返回0不存在

127.0.0.1:[]> hexists user id
(integer)
127.0.0.1:[]> hexists user age
(integer)

(3)使用hsetnx(hset if not exists)如果不存在赋值

127.0.0.1:[]> hsetnx user age
(integer)
127.0.0.1:[]> hget user age
""

(4)增加数字

127.0.0.1:[]> hincrby user score
(integer)
127.0.0.1:[]> hget user score
""

(5)删除字段

127.0.0.1:[]> hdel user score
(integer)
127.0.0.1:[]> hget user score
(nil)

如何存储数据?

(1)使用散列类型存储数据,散列数据包括三部分(键、字段、字段值)
键           字段     字段值
post:id field value
127.0.0.1:[]> incr userid
(integer)
127.0.0.1:[]> hset user: name test
(integer)
127.0.0.1:[]> hset user: score
(integer)
127.0.0.1:[]> incr userid
(integer)
127.0.0.1:[]> hset user: name test2
(integer)
127.0.0.1:[]> hset user: score
(integer)

添加了两条数据,id为1的名字为test分数为90,而id为2的名字为test2分数为90.

(2)获取多个字段的数据,需要使用hmget命令,并制定字段名称
127.0.0.1:[]> hmget user: name score
) "test"
) ""
(3)获取一行数据,不需要指定字段名称,只需要指出键名
127.0.0.1:[]> hgetall user:
) "name"
) "test2"
) "score"
) ""
(4)只获取字段名或字段值
127.0.0.1:[]> hkeys user:
) "name"
) "score"
127.0.0.1:[]> hvals user:
) "test"
) ""
(5)获取字段数量
127.0.0.1:[]> hlen user:
(integer)
需要注意的是,散列类型无法获取所有存在的键值,也就是id,如果删除了中间某个id的话,只可以使用exist命令来判断key是否存在。

列表类型

类表类型解决了上述的问题。
类表类型是有序的,值是可以重复的。
列表类型是通过双向链表实现的,向列表两端添加元素的时间复杂度为O(1),获取两端元素的速度也是最快。

基本操作

列表的基本操作命令都是以l开头的。

(1)添加和弹出元素使用lpush和rpush以及lpop和rpop分别从列表的左侧和右侧添加和删除元素。
127.0.0.1:> lpush user test
(integer)
127.0.0.1:> rpush user test1
(integer)
127.0.0.1:> lpop user
"test"
127.0.0.1:> rpop user
"test1"
127.0.0.1:>
(2)llen查看元素个数
127.0.0.1:> llen user
(integer)
127.0.0.1:> lpush user test
(integer)
127.0.0.1:> llen user
(integer)
(3)获取列表片段
127.0.0.1:> lrange user
) "test"
) "test1"
) "test2"
) "test3"
127.0.0.1:> lrange user
) "test"
) "test1"
) "test2"
(4)从列表中删除元素
lrem     key     count     value
@count 为删除个数,大于0的话从左边开始,小于0的话从右边开始
@value 要删除的值

我们可以把数据的id存储在列表中,当某一行数据被删除时候,只需要删除为该value为key即可,而查询数据的时候,需要先从列表中读取所有的id,再从散列表中读取数据。

 
(5)获取和设置索引元素值
 
(6)向列表中插入元素
127.0.0.1:> lrange user  -
) "test"
) "test1"
) "test2"
) "test3"
127.0.0.1:> linsert user before test1 test0
(integer)
127.0.0.1:> linsert user after test1 test1.
(integer)
127.0.0.1:> lrange user -
) "test"
) "test0"
) "test1"
) "test1.5"
) "test2"
) "test3"
(7)将元素从一个列表转移到另外一个列表
rdroplpush     source     destination
从source列表的右侧弹出一个数据,添加到destination列表的左侧

集合类型

集合中不允许重复数据的出现,数据是唯一的,无序的。
空的散列表的HASH TABLE实现,因此操作时间复杂度为O(1)。
(1)增加sadd和删除srem、获取所有元素smembers,返回值标识成功添加元素的数量:
127.0.0.1:> sadd key
(integer)
127.0.0.1:> sadd key
(integer)
127.0.0.1:> sadd key
(integer)
127.0.0.1:> smembers key
) ""
) ""
127.0.0.1:> srem key
(integer)
127.0.0.1:> smembers key
) ""
(2)判断元素是否在集合中可以使用sismember命令。
127.0.0.1:> sismember key
(integer)
127.0.0.1:> sismember key
(integer)
(3)集合运算
sdiff      key     [key...]
sinter key [key...]
sunion key [key...]
(4)获取元素个数
127.0.0.1:> scard key
(integer)
(5)集合运算并保存结果
sdiffstore       destination     key [key...]
sinterstore destination key[key...]
sunionstore destination key[key...]
(6)随机获取集合的元素
srandmember key [count]
127.0.0.1:> srandmember key
) ""
) ""
) ""
需要注意,srandmember取到的随机元素在集合比较小的情况下并不是完全随机的,由于redis的存储方法是利用哈希桶+数据链的存储方式,当桶和每个桶内元素的个数都非常小时就会造成取到相同数据的情况。

有序集合类型 sorted set

与普通的集合类型相比,有序集合为集合中的每一个元素都关联了一个分数,这使得我们不仅可以完成插入、删除和判断元素是否存在等集合的基本操作,还能够得到分数最高(或最低)的前n个元素、获得指定分数范围内的元素等与分有关的操作,虽然集合中的元素必须是不同的,但是其分数是可以相同的。
 
有序结合和列表的使用区别:
(1)列表类型是通过链来实现的,获取靠近两端数据的速度极快,而当元素增多后,访问中间元素的数据就会变慢,所以她更适合实现如“新鲜事”或“日志”这样少访问中间元素的应用。
(2)有序集合类型是使用散列和跳跃表实现的,所以即使读取位于中间部分数据的速度也很快(时间复杂度为O(log(n)))。
(3)列表中不能简单地调整某个元素的位置,但有序集合可以通过调整分数来实现位置的调整。
(4)有序集合更加消耗内存。

基本操作

(1)zadd添加元素,并设置分数score

127.0.0.1:> zadd students  xiaoming
(integer)
127.0.0.1:> zadd students daxiong
(integer)
(2)zscore获取元素分数
127.0.0.1:> zscore students xiaoming
""
(3)获取排名在某个范围的列表,元素是从0开始的
127.0.0.1:> zrange students
) "xiaoming"
) "daxiong"
(4)获取指定分数范围的元素,用于筛选数据
127.0.0.1:> zrangebyscore students
) "xiaoming"
127.0.0.1:> zrangebyscore students
) "xiaoming"
) "daxiong"
limit命令可以实现sql语句中的Limit效果
获取从0开始的前2个数据
127.0.0.1:> zrangebyscore students limit
) "xiaoming"
) "daxiong"
获取从1开始的前2个数据
127.0.0.1:> zrangebyscore students limit
) "daxiong"
(5)增加和减少某个元素的分数
127.0.0.1:> zincrby students  xiaoming
""
127.0.0.1:> zincrby students - xiaoming
""
(6)获取集合中元素个数
127.0.0.1:> zcard students
(integer)
(7)获取指定分数范围内的元素个数
zcount     key     min     max

127.0.0.1:> zcount students
(integer)
127.0.0.1:> zcount students
(integer)
(8)删除一个或多个元素
zrem     key     [key...]
(9)按照排名范围来删除元素
zremrangebyrank     key     start     stop
(10)按照分数范围来删除元素
zremrangebyscore     key     min     max
(11)获取元素的排名,注意元素从0开始排序
127.0.0.1:> zrank students xiaoming
(integer)

参考

redis入门指南

http://redis.readthedocs.org/en/latest/

redis(一) 安装以及基本数据类型操作的更多相关文章

  1. Redis:安装、配置、操作和简单代码实例(C语言Client端)

    Redis:安装.配置.操作和简单代码实例(C语言Client端) - hj19870806的专栏 - 博客频道 - CSDN.NET Redis:安装.配置.操作和简单代码实例(C语言Client端 ...

  2. Redis快速入门:安装、配置和操作

    本文是有关Redis的系列技术文章之一.在之前的文章中介绍了<Redis快速入门:初识Redis>,对Redis有了一个初步的了解.今天继续为大家介绍Redis如何安装.配置和操作. 系列 ...

  3. Redis简介、与memcached比较、存储方式、应用场景、生产经验教训、安全设置、key的建议、安装和常用数据类型介绍、ServiceStack.Redis使用(1)

    1.NOSQL简介 nosql的产生并不是要彻底的代替关系型数据库,而是作为传统关系型数据库的一个补充. Facebook和360使用Cassandra来存储海量社交数据 Twitter在其url抓取 ...

  4. 缓存系列之三:redis安装及基本数据类型命令使用

    一:Redis是一个开源的key-value存储系统.与Memcached类似,Redis将大部分数据存储在内存中,支持的数据类型包括:字符串.哈希表.链表.集合.有序集合以及基于这些数据类型的相关操 ...

  5. redis的安装使用以及在python中操作redis

    一.Redis介绍: Redis可以看作是一个key-value的存储系统,它为我们提供了丰富的数据结构,包括lists,sets,ordered sets和hashes.还包括了对这些数据结构的丰富 ...

  6. redis安装启动和数据操作

    redis安装和启动 1.安装包下载地址 >> redis基本数据类型 string(字符串和数值) .list(列表/队列).hashmap(哈希表[键唯一]). set(集合[值唯一] ...

  7. redis基础:redis下载安装与配置,redis数据类型使用,redis常用指令,jedis使用,RDB和AOF持久化

    知识点梳理 课堂讲义 课程计划 1. REDIS 入 门 (了解) (操作)   2. 数据类型 (重点) (操作) (理解) 3. 常用指令   (操作)   4. Jedis (重点) (操作) ...

  8. 大数据学习day31------spark11-------1. Redis的安装和启动,2 redis客户端 3.Redis的数据类型 4. kafka(安装和常用命令)5.kafka java客户端

    1. Redis Redis是目前一个非常优秀的key-value存储系统(内存的NoSQL数据库).和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list ...

  9. windows下Redis安装及利用java操作Redis

    一.windows下Redis安装 1.Redis下载 下载地址:https://github.com/MicrosoftArchive/redis 打开下载地址后,选择版本 然后选择压缩包 下载 R ...

随机推荐

  1. row_number和partition by分组取top数据

    分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系统中取出每个学科前3名的学生.这种查询在SQL Server 2005之前,写起来很繁琐,需要用到临时表关联查询才能取到.SQL Serve ...

  2. 'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)'

    error C2784: 'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Tra ...

  3. 【转】js判断手机访问网页

    原理:原理有两个,第一:通过游览器(browser)判断是否是手机:第二:通过访问终端判断是否是手机(userAgent):但是通常考虑到兼容性,需要这两种原理同时使用:具体的实现如下: JS实现: ...

  4. tab栏切换的特殊效果

    在实际的开发过程中,我们可能会遇到这种需求,如下图 左边是三个tab栏,右边是显示内容的div,当鼠标滑到坐标的tab上时,给它一个高亮显示,让它对应的内容在右边的div中显示出来,当鼠标移出的时候把 ...

  5. 上传App Store成功后,无法构建版本解决方法

    最近iOS10出来了,Xcode也跟着升级到了8,想着App做个更新,于是修改好了代码打算上传新包,无奈总是发现构建不了新版本.这种情况是因为苹果更重视用户的隐私,知道原因就能想到对策了,就是在pli ...

  6. 记录Python学习中的几个小问题

    记录Python学习中的几个小问题,和C#\JAVA的习惯都不太一样. 1.Django模板中比较两个值是否相等 错误的做法 <option value="{{group.id}}&q ...

  7. [UCSD白板题] Changing Money

    Problem Introduction In this problem,you will design an algorithm for changing money optimally. Prob ...

  8. XAF How to show custom forms and controls in XAF (Example)

    XAF How to show custom forms and controls in XAF (Example) https://www.devexpress.com/Support/Center ...

  9. 为Apache动态增加模块

    Apache已经安装完毕并投入运行,但是后来却发现部分模块没有加载,当然有两个方法: 1. 一是完全重新编译Apache, 再安装 2. 编译模块为SO文件,使用LoadModule指令加载扩展模块. ...

  10. php composer使用经验

    1.使用composer引用了一个包,但是这个包没有使用命名空间,在项目中该如何使用这个包? 编辑composer.json文件 "autoload":{ "files& ...