Redis 是内存级操作,所以单次的查询会很快,非常适合用于一些快速搜索场景。本文以邮箱通讯录为例,介绍redis快速搜索。
编程语言:golang
接口框架:beego
1、Redis连接
采用连接池方式连接redis数据库

var RedisClient *redis.Poolfunc ConnectRedis() {host := beego.AppConfig.DefaultString("redis.host", "127.0.0.1:6379")//通过beego配置文件获取pwd := beego.AppConfig.DefaultString("redis.psw", "")MaxIdle := beego.AppConfig.DefaultInt("redis.MaxIdle", 100)MaxActive := beego.AppConfig.DefaultInt("redis.MaxActive", 1024)RedisClient = &redis.Pool{// 从配置文件获取maxidle以及maxactive,取不到则用后面的默认值MaxIdle:     MaxIdle,MaxActive:   MaxActive,IdleTimeout: 180 * time.Second,Dial: func() (redis.Conn, error) {c, err := redis.Dial("tcp", host, redis.DialPassword(pwd))if err != nil {return nil, err}return c, nil},}}

2、存数据库
redis实现快速查找,最好是将查询条件作为key存入,以邮箱通讯录为例,需要按照邮箱号数字、姓名、拼音三种方式查询,因此需要分别以邮箱号、姓名、拼音为key建三张表,其中拼音查询需要引用第三方包"github.com/Lofanmi/pinyin-golang/pinyin"

type UserInfo struct {Name        string        //邮箱号,如"455*****"Displayname string   //用户名,如“张三”Mail        string          //邮箱,如“455*****@qq.com.cn”
}

beego框架中在model中定义用户数据结构UserInfo

func SetUserNameMail(userInfos map[int]models.UserInfo) error { //用邮箱数字做key,邮箱做valuercc := RedisClient.Get()_, err := rcc.Do("SELECT", 1)if err != nil {return err}for _, v := range userInfos {_, err = rcc.Do("HMSET", v.Name, "mail", v.Mail, "displayName", v.Displayname)if err != nil {return err}}return nil
}func SetUserDisplaynameMail(userInfos map[int]models.UserInfo) error { //用户名做key,邮箱做valuercc := RedisClient.Get()_, err := rcc.Do("SELECT", 2)if err != nil {return err}for _, v := range userInfos {_, err = rcc.Do("HMSET", v.Displayname, "mail", v.Mail, "name", v.Name)if err != nil {return err}}return nil
}func SetUserPinYingDisplaynameMail(userInfos map[int]models.UserInfo) error { //用户名拼音做key,邮箱做valuercc := RedisClient.Get()dict := pinyin.NewDict()_, err := rcc.Do("SELECT", 3)if err != nil {return err}for _, v := range userInfos {temPinyinDisName := dict.Sentence(v.Displayname).None() //汉字转拼音PinyinDisplayname := strings.Replace(temPinyinDisName, " ", "", -1) _, err = rcc.Do("HMSET", PinyinDisplayname, "mail", v.Mail, "displayName", v.Displayname, "department", v.Department, "title", v.Title)if err != nil {return err}}return nil
}

3、根据邮箱号、用户名、汉语拼音模糊查找

func FuzzyQueryAddressNumber(key string) []map[string]string { //查第一张表,输入邮箱数字,查通信录var result []map[string]stringvar values []stringrcc := RedisClient.Get()_, err := rcc.Do("SELECT", 1)if err != nil {return nil}values, err = redis.Strings(rcc.Do("KEYS", key+"*"))if err != nil {return nil}if len(values) < 10 {for _, v := range values {res, err := redis.Strings(rcc.Do("HGETALL", v))//result[k] = map[string]string{res[0]: res[1], res[2]: res[3]}result = append(result, map[string]string{res[0]: res[1], res[2]: res[3]})if err != nil {continue}}} else {for k, v := range values {res, err := redis.Strings(rcc.Do("HGETALL", v))//result[k] = map[string]string{res[0]: res[1], res[2]: res[3]}result = append(result, map[string]string{res[0]: res[1], res[2]: res[3]})if err != nil {continue}if k >= 10 {break}}}return result
}func FuzzyQueryDisplayName(key string) []map[string]string { //查第二张表,输入用户名,查通信录var result []map[string]stringvar values []stringrcc := RedisClient.Get()_, err := rcc.Do("SELECT", 2)if err != nil {return nil}values, err = redis.Strings(rcc.Do("KEYS", key+"*"))if err != nil {return nil}if len(values) < 10 {for _, v := range values {res, err := redis.Strings(rcc.Do("HGETALL", v))//result[k] = map[string]string{res[0]: res[1], "displayName": v}result = append(result, map[string]string{res[0]: res[1], "displayName": v})if err != nil {continue}}} else {for k, v := range values {res, err := redis.Strings(rcc.Do("HGETALL", v))//result[k] = map[string]string{res[0]: res[1], "displayName": v}result = append(result, map[string]string{res[0]: res[1], "displayName": v})if err != nil {continue}if k >= 10 {break}}}return result
}func FuzzyQueryPinyinDisplayName(key string) []map[string]string { //查第三张表,输入用户名拼音,查通信录var result []map[string]stringvar values []stringrcc := RedisClient.Get()_, err := rcc.Do("SELECT", 3)if err != nil {return nil}values, err = redis.Strings(rcc.Do("KEYS", key+"*"))if err != nil {return nil}if len(values) < 10 {for _, v := range values {res, err := redis.Strings(rcc.Do("HGETALL", v))result = append(result, map[string]string{res[0]: res[1], res[2]: res[3], res[4]: res[5], res[6]: res[7]})if err != nil {continue}}} else {for k, v := range values {res, err := redis.Strings(rcc.Do("HGETALL", v))result = append(result, map[string]string{res[0]: res[1], res[2]: res[3], res[4]: res[5], res[6]: res[7]})if err != nil {continue}if k >= 10 {break}}}return result
}

4、根据正则匹配按照数字、汉字、拼音查找

func Validate(str string) int {reg1 := regexp.MustCompile(`[0-9]+`)reg2 := regexp.MustCompile(`[\p{Han}]+`)reg3 := regexp.MustCompile(`[a-z]+`)if reg1.MatchString(str) {return 1}if reg2.MatchString(str) {return 2}if reg3.MatchString(str) {return 3}return -1
}

5、基于beego框架的通讯录查询接口

type GeneralResp struct {Code  int         `json:"code"`Data  interface{} `json:"data"`Error string      `json:"error"`
}

返回结果结构GeneralResp

func (this *MainController) GetAddressBook() {// queryResult := make(map[int]map[string]string)var queryResult []map[string]stringqueryOp := this.Input().Get("queryOp")switch tools.Validate(queryOp) {case 1:queryResult = database.FuzzyQueryAddressNumber(queryOp)this.Data["json"] = models.GeneralResp{Code: 1, Data: queryResult}case 2:queryResult = database.FuzzyQueryDisplayName(queryOp)this.Data["json"] = models.GeneralResp{Code: 1, Data: queryResult}case 3:queryResult = database.FuzzyQueryPinyinDisplayName(queryOp)this.Data["json"] = models.GeneralResp{Code: 1, Data: queryResult}default:this.Data["json"] = models.GeneralResp{Code: 0}}this.ServeJSON()
}

如有不对欢迎指正,相互学习,共同进步。

Redis按照数字、汉字、拼音快速搜索通讯录接口相关推荐

  1. iOS 通过数字拼音快速搜索股票

    2015-09-04 by 木易哥哥 实现思路,先定义股票数组字典,一只股票作为1个数组,元素中包含股票数字代码和拼音简称,然后用一个大数组包含所有股票的数组,转成字典. 相关代码如下: //搜索Te ...

  2. Python实现批量汉字转拼音作搜索框提示词

    下拉框提示词也称Suggestion(查询词提示),这已经是搜索引擎必备的一个功能了,而问答系统则是搜索引擎的精简版,也需要检索提示功能,给用户带来便捷,提高产品的体验感. 当你在搜索框进行输入时,搜 ...

  3. 不使用pinyin4j, 通过字符串截取手段快速查询通讯录联系人的拼音(包括全拼和简拼)

    不使用pinyin4j, 通过字符串截取手段快速查询通讯录联系人的拼音(包括全拼和简拼) 刚开始我也是使用pinyin4j但是速度太慢8分钟还加载不完我的280个联系人数据,所以我选择另谋出路.发现有 ...

  4. mysql数据库sql汉字数字排序_MYSQL数据库UTF8编码使用汉字拼音第一个字母排序的方法...

    MYSQL数据库UTF8编码使用汉字拼音第一个字母排序的方法 今天做网站时遇到了这样一个问题,有一个标签数据库,在管理标签时想按标签列的汉字拼音的第一个字母排序,这样人工查找的时候就很快可以看到: 于 ...

  5. 快速搜索匹配联系人算法

    在通讯录应用中,快速搜索匹配符合关键字的联系人,是一个必备的需求.比如要搜索 名字 尼古拉斯赵四 ,电话号码 1234567 这个联系人,我们可以输入: 1.中文全名 尼古拉斯赵四 2.中文部分名字 ...

  6. [C#][转载]C# 使用微软的Visual Studio International Pack 类库提取汉字拼音首字母

    昨天经过网友提醒,提取汉字拼音的方法可以使用微软的一个类库 Visual Studio International Pack ,今天试了一试,确实好用!下面分享下使用方法: 首先下载Visual St ...

  7. 项目文件快速搜索神器

    快速搜索神器 项目代码:github地址 先看看我们的项目成果吧 汉字搜索 汉字首字母搜索 汉字全拼搜索 1.调研实现背景 在linux环境下有非常好用的find命令,查找文档非常的高效,但是在win ...

  8. 【C#】获取汉字拼音首字母和全拼

    文章目录 利用CJK统一表意符号获取首字母 获取首字母和全拼 另附sql server解决方案 来源 java的同学可以了解下pinyin4j,js可以了解ChinesePY.js 获取拼音的意义多在 ...

  9. 【项目】---文档快速搜索工具

    目录 一.项目背景 二.项目需求分析 三.项目涉及的知识点 四.项目实现的基础理论 五.项目框架 六.增加系统工具模块 6.1.扫描本地的文件的功能 七.增加数据管理模块 7.1.先了解数据库sqli ...

最新文章

  1. ARKIT/ARCore对比分析(二)
  2. 机器学习训练中常见的问题和挑战
  3. JavaScript命名规范与变量声明的注意事项
  4. Machine Learning - Andrew Ng on Coursera (Week 1)
  5. 数据中心管理将成为未来十年所需的技能
  6. 玩转GIT系列之【git的分支操作(查看分支/切换分支/新建分支/删除分支)】
  7. codeigniter view 试图里再引入view视图
  8. 手把手Maven搭建SpringMVC+Spring+MyBatis框架(超级详细版)
  9. 服务器响应速度是上行速度吗,服务器带宽与速度之间的关系
  10. java+2e10_CoreJavaE10V1P3.10 第3章 Java的基本编程结构-3.10 数组(Arrays)
  11. pillow支持python 2和python 3_python3读取图像并可视化的方法(PIL/Pillow、opencv/cv2)...
  12. 苹果春季发布会已开启直播;滴滴回应网约车司机被害​;微软Chromium内核浏览器曝光 | 极客头条...
  13. Ubuntu 8.04 Hardy LTS 软件源设置
  14. 神经网络加速器设计研究:GoSPA ISCA2021论文研读
  15. “_CRT_SECURE_NO_DEPRECATE”: 未定义宏或在预编译头使用后定义发生改变
  16. HBase启动成功,但不能访问Web页面
  17. Lenovo 10w 平板评测
  18. 混合现实在医学领域的应用学习日志
  19. python正则检验_Python 检测生僻字
  20. 操作系统如何建立异常处理?

热门文章

  1. JAVA计算机毕业设计病人跟踪治疗信息管理系统演示2021Mybatis+源码+数据库+lw文档+系统+调试部署
  2. Phonetic symbol 辅音 - 浊辅音 -- /ð/
  3. PowerDesigner连接oracle、PDMReader导出数据库字典
  4. 盘古开源:跨国车企开年即削减产量,芯片危机2022年仍无望缓解?
  5. python函数形参_python函数形参用法实例分析
  6. Android中XML的三种解析器分析、实战
  7. 嵌入式:利用TF卡给4412开发板的emmc上烧写安卓系统
  8. PyCharm中的光标
  9. ARM指令之MOV指令汇编与机器码的对应关系
  10. An Introduction to Shiro (formerly JSecurity) – A Beginner’s Tutorial Part 3